diff --git a/starlog.go b/starlog.go index 1a83064..0671ca3 100644 --- a/starlog.go +++ b/starlog.go @@ -10,8 +10,10 @@ import ( "time" "github.com/fatih/color" + "github.com/mattn/go-colorable" ) +// Base attributes const ( BLUE = color.FgBlue BLACK = color.FgBlack @@ -21,10 +23,11 @@ const ( RED = color.FgRed WHITE = color.FgWhite YELLOW = color.FgYellow - GREY = color.FgHiYellow + GREY = color.FgHiRed BOLD = color.Bold ) +// Log Level const ( LvDebug = iota LvInfo @@ -36,6 +39,7 @@ const ( LvFatal ) +// Log Init Data var ( levels = map[int]string{ LvDebug: "DEBUG", @@ -62,10 +66,15 @@ var ( loghandle *os.File = nil HandleFunc func([]color.Attribute, string) lock sync.WaitGroup + waiting = make(chan int, 1) ) +// Output 使用此进行windows支持 +var Output = colorable.NewColorableStdout() + func write(logs string) { - var i int = 0 + var i int + lock.Add(1) defer lock.Done() for switching { time.Sleep(time.Millisecond * 100) @@ -82,6 +91,10 @@ func write(logs string) { func output(level int, showline, showlv, dowrite, doshow bool, strlog string) { var logs string + waiting <- 1 + defer func() { + <-waiting + }() if level < LogLevel { return } @@ -98,67 +111,59 @@ func output(level int, showline, showlv, dowrite, doshow bool, strlog string) { logs = fmt.Sprintf("%s %s", date, strlog) } if doshow { - for _, v := range Colors[level] { - color.Set(v) - } - fmt.Print(logs) - color.Set(color.Reset) + logcolor := color.New(Colors[level]...) + logstr := logcolor.Sprint(logs) + fmt.Fprint(Output, logstr) } if HandleFunc != nil { go HandleFunc(Colors[level], logs) } if dowrite { - lock.Add(1) write(logs) } } +// StdPrint 进行stdout标准输出 func StdPrint(c1, c2 color.Attribute, str ...interface{}) { - color.Set(c1) - color.Set(c2) - fmt.Print(str...) - color.Set(color.Reset) + waiting <- 1 + defer func() { + <-waiting + }() + colorstr := color.New(c1, c2) + colorstr.Fprint(Output, str...) } func StdPrintf(c1, c2 color.Attribute, format string, str ...interface{}) { - color.Set(c1) - color.Set(c2) - fmt.Printf(format, str...) - color.Set(color.Reset) + waiting <- 1 + defer func() { + <-waiting + }() + colorstr := color.New(c1, c2) + colorstr.Fprintf(Output, format, str...) } func StdPrintln(c1, c2 color.Attribute, str ...interface{}) { - color.Set(c1) - color.Set(c2) - fmt.Println(str...) - color.Set(color.Reset) + waiting <- 1 + defer func() { + <-waiting + }() + colorstr := color.New(c1, c2) + colorstr.Fprintln(Output, str...) } func Print(c1, c2 color.Attribute, str ...interface{}) { - color.Set(c1) - color.Set(c2) - strs := fmt.Sprint(str...) - fmt.Print(strs) - color.Set(color.Reset) - write(strs) + StdPrint(c1, c2, str...) + write(fmt.Sprint(str...)) } func Printf(c1, c2 color.Attribute, format string, str ...interface{}) { - color.Set(c1) - color.Set(c2) - strs := fmt.Sprintf(format, str...) - fmt.Print(strs) - color.Set(color.Reset) - write(strs) + StdPrintf(c1, c2, format, str...) + write(fmt.Sprintf(format, str...)) } func Println(c1, c2 color.Attribute, str ...interface{}) { - color.Set(c1) - color.Set(c2) - strs := fmt.Sprintln(str...) - fmt.Print(strs) - color.Set(color.Reset) - write(strs) + StdPrintln(c1, c2, str...) + write(fmt.Sprintln(str...)) } func Debug(str ...interface{}) {