|
|
- package glog
-
- import (
- "bytes"
- "strings"
-
- "github.com/gookit/color"
- )
-
- var (
- // Info color style
- StyleInfo = &color.Style{color.OpReset, color.Green}
- StyleWarn = &color.Style{color.OpBold, color.Yellow}
- StyleError = &color.Style{color.OpBold, color.Red}
- StyleBlue = &color.Style{color.OpBold, color.Blue} //蓝色
- StyleMagenta = &color.Style{color.OpBold, color.Magenta} //品红
- StyleCyan = &color.Style{color.OpReset, color.Cyan} //青色
- )
-
- func min(args ...int) int {
- t := -1
- for _, arg := range args {
- if arg >= 0 && (arg < t || t == -1) {
- t = arg
- }
- }
- return t
- }
-
- var hiddenType = make(map[string]bool)
-
- func SetSubTypeHidden(subTypes ...string) {
- if len(subTypes) > 0 {
- for _, subType := range subTypes {
- hiddenType[subType] = true
- }
- }
- }
-
- func SetSubTypeShow(subTypes ...string) {
- if len(subTypes) > 0 {
- for _, subType := range subTypes {
- delete(hiddenType, subType)
- }
- }
- }
-
- // <i>content</i>: info
- // <w>content</w>: warn
- // <e>content</e>: error
- // <b>content</b>: blue
- // <m>content</m>: magenta
- // <c>content</c>: cyan
- func osStdoutWrite(s Severity, subType string, data []byte) {
- for st, _ := range hiddenType {
- if subType == st {
- return
- }
- }
- switch s {
- case DebugLog:
- StyleCyan.Print(subType + " ")
- StyleCyan.Print("DBG")
- case InfoLog:
- StyleInfo.Print(subType + " ")
- StyleInfo.Print("INF")
- case WarningLog:
- StyleWarn.Print(subType + " ")
- StyleWarn.Print("WAR")
- case ErrorLog:
- StyleError.Print(subType + " ")
- StyleError.Print("ERR")
- case FatalLog:
- StyleError.Print(subType + " ")
- StyleError.Print("FAT")
- case OtherLog:
- StyleCyan.Print(subType + " ")
- StyleCyan.Print("OTR")
- default:
- }
-
- ds := string(data)
- LABEL_LOOP:
- for {
-
- ie := strings.Index(ds, "<e>")
- iw := strings.Index(ds, "<w>")
- ii := strings.Index(ds, "<i>")
- ib := strings.Index(ds, "<b>")
- im := strings.Index(ds, "<m>")
- ic := strings.Index(ds, "<c>")
- i := min(ie, iw, ii, ib, im, ic)
- if i < 0 {
- break
- }
- je := strings.Index(ds, "</e>")
- jw := strings.Index(ds, "</w>")
- ji := strings.Index(ds, "</i>")
- jb := strings.Index(ds, "</b>")
- jm := strings.Index(ds, "</m>")
- jc := strings.Index(ds, "</c>")
- j := min(je, jw, ji, jb, jm, jc)
- if j < 0 || j < (i+3) {
- break
- }
- switch ds[i+1] {
- case 'i':
- color.Print(ds[:i])
- StyleInfo.Print(ds[i+3 : j])
- ds = ds[j+4:]
- case 'w':
- color.Print(ds[:i])
- StyleWarn.Print(ds[i+3 : j])
- ds = ds[j+4:]
- case 'e':
- color.Print(ds[:i])
- StyleError.Print(ds[i+3 : j])
- ds = ds[j+4:]
- case 'b':
- color.Print(ds[:i])
- StyleBlue.Print(ds[i+3 : j])
- ds = ds[j+4:]
- case 'm':
- color.Print(ds[:i])
- StyleMagenta.Print(ds[i+3 : j])
- ds = ds[j+4:]
- case 'c':
- color.Print(ds[:i])
- StyleCyan.Print(ds[i+3 : j])
- ds = ds[j+4:]
- default:
- break LABEL_LOOP
- }
- }
- color.Print(ds)
- }
-
- func osStdoutWriteNoStyle(data []byte) {
- color.Print(string(data))
- }
-
- func filterStdout(data []byte) []byte {
- data = bytes.Replace(data, []byte{'<', 'e', '>'}, nil, -1)
- data = bytes.Replace(data, []byte{'<', 'w', '>'}, nil, -1)
- data = bytes.Replace(data, []byte{'<', 'i', '>'}, nil, -1)
- data = bytes.Replace(data, []byte{'<', '/', 'e', '>'}, nil, -1)
- data = bytes.Replace(data, []byte{'<', '/', 'w', '>'}, nil, -1)
- data = bytes.Replace(data, []byte{'<', '/', 'i', '>'}, nil, -1)
- return data
- }
|