mirror of
https://gitee.com/johng/gf
synced 2026-06-06 16:21:40 +08:00
add log level prefix color
This commit is contained in:
@ -43,6 +43,7 @@ const (
|
||||
defaultFilePerm = os.FileMode(0666)
|
||||
defaultFileExpire = time.Minute
|
||||
pathFilterKey = "/os/glog/glog"
|
||||
bufferStdOut = "stdOut"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -220,20 +221,19 @@ func (l *Logger) print(ctx context.Context, level int, values ...interface{}) {
|
||||
|
||||
// printToWriter writes buffer to writer.
|
||||
func (l *Logger) printToWriter(ctx context.Context, input *HandlerInput) {
|
||||
buffer := input.Buffer()
|
||||
if l.config.Writer == nil {
|
||||
// Output content to disk file.
|
||||
if l.config.Path != "" {
|
||||
l.printToFile(input.Time, buffer)
|
||||
l.printToFile(input.Time, input.Buffer())
|
||||
}
|
||||
// Allow output to stdout?
|
||||
if l.config.StdoutPrint {
|
||||
if _, err := os.Stdout.Write(buffer.Bytes()); err != nil {
|
||||
if _, err := os.Stdout.Write(input.Buffer(bufferStdOut).Bytes()); err != nil {
|
||||
intlog.Error(err)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if _, err := l.config.Writer.Write(buffer.Bytes()); err != nil {
|
||||
if _, err := l.config.Writer.Write(input.Buffer().Bytes()); err != nil {
|
||||
// panic(err)
|
||||
intlog.Error(err)
|
||||
}
|
||||
|
||||
@ -245,3 +245,14 @@ func (l *Logger) Async(enabled ...bool) *Logger {
|
||||
}
|
||||
return logger
|
||||
}
|
||||
|
||||
func (l *Logger) Color(color logColor) *Logger {
|
||||
logger := (*Logger)(nil)
|
||||
if l.parent == nil {
|
||||
logger = l.Clone()
|
||||
} else {
|
||||
logger = l
|
||||
}
|
||||
logger.SetColor(color)
|
||||
return logger
|
||||
}
|
||||
@ -42,6 +42,7 @@ type Config struct {
|
||||
RotateBackupExpire time.Duration `json:"rotateBackupExpire"` // Max expire for rotated files, which is 0 in default, means no expiration.
|
||||
RotateBackupCompress int `json:"rotateBackupCompress"` // Compress level for rotated files using gzip algorithm. It's 0 in default, means no compression.
|
||||
RotateCheckInterval time.Duration `json:"rotateCheckInterval"` // Asynchronizely checks the backups and expiration at intervals. It's 1 hour in default.
|
||||
color logColor `json:"-"`
|
||||
}
|
||||
|
||||
// DefaultConfig returns the default configuration for logger.
|
||||
@ -252,3 +253,7 @@ func (l *Logger) SetPrefix(prefix string) {
|
||||
func (l *Logger) SetHandlers(handlers ...Handler) {
|
||||
l.config.Handlers = append(handlers, defaultHandler)
|
||||
}
|
||||
|
||||
func (l *Logger) SetColor(color logColor) {
|
||||
l.config.color = color
|
||||
}
|
||||
|
||||
@ -9,6 +9,7 @@ package glog
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
@ -42,11 +43,15 @@ func (i *HandlerInput) addStringToBuffer(buffer *bytes.Buffer, s string) {
|
||||
buffer.WriteString(s)
|
||||
}
|
||||
|
||||
func (i *HandlerInput) Buffer() *bytes.Buffer {
|
||||
func (i *HandlerInput) Buffer(bufferType ...string) *bytes.Buffer {
|
||||
buffer := bytes.NewBuffer(nil)
|
||||
buffer.WriteString(i.TimeFormat)
|
||||
if i.LevelFormat != "" {
|
||||
i.addStringToBuffer(buffer, i.LevelFormat)
|
||||
if len(bufferType) > 0 && bufferType[0] == bufferStdOut {
|
||||
i.addStringToBuffer(buffer, i.getLevelFormatWithColor())
|
||||
} else {
|
||||
i.addStringToBuffer(buffer, i.LevelFormat)
|
||||
}
|
||||
}
|
||||
if i.CallerFunc != "" {
|
||||
i.addStringToBuffer(buffer, i.CallerFunc)
|
||||
@ -67,6 +72,16 @@ func (i *HandlerInput) Buffer() *bytes.Buffer {
|
||||
return buffer
|
||||
}
|
||||
|
||||
// getLevelFormatWithColor returns the prefix string with color.
|
||||
func (i *HandlerInput) getLevelFormatWithColor() string {
|
||||
s := i.LevelFormat
|
||||
color := defaultLevelColor[i.Level]
|
||||
if i.logger.config.color != 0 {
|
||||
color = i.logger.config.color
|
||||
}
|
||||
return fmt.Sprintf("\x1b[0;%dm%s\x1b[0m", color, s)
|
||||
}
|
||||
|
||||
func (i *HandlerInput) String() string {
|
||||
return i.Buffer().String()
|
||||
}
|
||||
|
||||
@ -29,6 +29,19 @@ const (
|
||||
LEVEL_FATA // 1024
|
||||
)
|
||||
|
||||
type logColor int
|
||||
|
||||
const (
|
||||
COLOR_BLACK logColor = 30 + iota
|
||||
COLOR_RED
|
||||
COLOR_GREEN
|
||||
COLOR_YELLOW
|
||||
COLOR_BLUE
|
||||
COLOR_MAGENTA
|
||||
COLOR_CYAN
|
||||
COLOR_WHITE
|
||||
)
|
||||
|
||||
// defaultLevelPrefixes defines the default level and its mapping prefix string.
|
||||
var defaultLevelPrefixes = map[int]string{
|
||||
LEVEL_DEBU: "DEBU",
|
||||
@ -41,6 +54,18 @@ var defaultLevelPrefixes = map[int]string{
|
||||
LEVEL_FATA: "FATA",
|
||||
}
|
||||
|
||||
// defaultLevelColor defines the default level and its mapping prefix string.
|
||||
var defaultLevelColor = map[int]logColor{
|
||||
LEVEL_DEBU: COLOR_YELLOW,
|
||||
LEVEL_INFO: COLOR_GREEN,
|
||||
LEVEL_NOTI: COLOR_CYAN,
|
||||
LEVEL_WARN: COLOR_YELLOW,
|
||||
LEVEL_ERRO: COLOR_RED,
|
||||
LEVEL_CRIT: COLOR_RED,
|
||||
LEVEL_PANI: COLOR_RED,
|
||||
LEVEL_FATA: COLOR_RED,
|
||||
}
|
||||
|
||||
// levelStringMap defines level string name to its level mapping.
|
||||
var levelStringMap = map[string]int{
|
||||
"ALL": LEVEL_DEBU | LEVEL_INFO | LEVEL_NOTI | LEVEL_WARN | LEVEL_ERRO | LEVEL_CRIT,
|
||||
|
||||
Reference in New Issue
Block a user