mirror of
https://github.com/Monibuca/engine.git
synced 2025-10-07 17:40:57 +08:00
88 lines
2.0 KiB
Go
88 lines
2.0 KiB
Go
package engine
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"sync"
|
|
|
|
"github.com/logrusorgru/aurora"
|
|
"github.com/mattn/go-colorable"
|
|
)
|
|
|
|
// LogWriter 多端写日志类
|
|
type LogWriter struct {
|
|
*MultiLogWriter
|
|
}
|
|
type MultiLogWriter struct {
|
|
sync.Map
|
|
}
|
|
|
|
var logWriter = &LogWriter{new(MultiLogWriter)}
|
|
var multiLogger = log.New(logWriter.MultiLogWriter, "", log.LstdFlags)
|
|
var colorLogger = log.New(colorable.NewColorableStdout(), "", log.LstdFlags)
|
|
|
|
func init() {
|
|
log.SetOutput(logWriter)
|
|
}
|
|
func (w *LogWriter) Write(data []byte) (n int, err error) {
|
|
os.Stdout.Write(data)
|
|
return w.MultiLogWriter.Write(data)
|
|
}
|
|
func (w *MultiLogWriter) Write(data []byte) (n int, err error) {
|
|
w.Range(func(k, v interface{}) bool {
|
|
n, err = k.(io.Writer).Write(data)
|
|
if err != nil {
|
|
w.Delete(k)
|
|
}
|
|
return true
|
|
})
|
|
return
|
|
}
|
|
|
|
// AddWriter 添加日志输出端
|
|
func AddWriter(wn io.Writer) {
|
|
logWriter.Store(wn, wn)
|
|
}
|
|
|
|
// MayBeError 优雅错误判断加日志辅助函数
|
|
func MayBeError(info error) (hasError bool) {
|
|
if hasError = info != nil; hasError {
|
|
Print(aurora.Red(info))
|
|
}
|
|
return
|
|
}
|
|
func getNoColor(v ...interface{}) (noColor []interface{}) {
|
|
noColor = append(noColor, v...)
|
|
for i, value := range v {
|
|
if vv, ok := value.(aurora.Value); ok {
|
|
noColor[i] = vv.Value()
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
// Print 带颜色识别
|
|
func Print(v ...interface{}) {
|
|
noColor := getNoColor(v...)
|
|
colorLogger.Output(2, fmt.Sprint(v...))
|
|
multiLogger.Output(2, fmt.Sprint(noColor...))
|
|
}
|
|
|
|
// Printf calls Output to print to the standard logger.
|
|
// Arguments are handled in the manner of fmt.Printf.
|
|
func Printf(format string, v ...interface{}) {
|
|
noColor := getNoColor(v...)
|
|
colorLogger.Output(2, fmt.Sprintf(format, v...))
|
|
multiLogger.Output(2, fmt.Sprintf(format, noColor...))
|
|
}
|
|
|
|
// Println calls Output to print to the standard logger.
|
|
// Arguments are handled in the manner of fmt.Println.
|
|
func Println(v ...interface{}) {
|
|
noColor := getNoColor(v...)
|
|
colorLogger.Output(2, fmt.Sprintln(v...))
|
|
multiLogger.Output(2, fmt.Sprintln(noColor...))
|
|
}
|