go_dreamfactory/lego/sys/log/formatter_console.go
2022-12-19 16:35:25 +08:00

129 lines
2.7 KiB
Go

package log
import (
"encoding/json"
"time"
"go_dreamfactory/lego/utils/pools"
)
func NewConsoleEncoder() Formatter {
return &ConsoleFormatter{}
}
type ConsoleFormatter struct {
*EncoderConfig
}
func (this *ConsoleFormatter) Format(config *EncoderConfig, entry *Entry) (*pools.Buffer, error) {
line := pools.BufferPoolGet()
isfirst := true
if config.TimeKey != "" && config.EncodeTime != nil {
line.AppendString(config.EncodeTime(entry.Time))
isfirst = false
}
if config.LevelKey != "" && config.EncodeLevel != nil {
if !isfirst {
line.AppendString(config.ConsoleSeparator)
}
isfirst = false
line.AppendString(config.EncodeLevel(entry.Level))
}
if entry.Caller.Defined {
if config.CallerKey != "" && config.EncodeCaller != nil {
if !isfirst {
line.AppendString(config.ConsoleSeparator)
}
isfirst = false
line.AppendString(config.EncodeCaller(entry.Caller))
}
if config.FunctionKey != "" {
if !isfirst {
line.AppendString(config.ConsoleSeparator)
}
isfirst = false
line.AppendString(entry.Caller.Function)
}
}
if entry.Name != "" {
if !isfirst {
line.AppendString(config.ConsoleSeparator)
}
isfirst = false
line.AppendString("[")
line.AppendString(entry.Name)
line.AppendString("]")
}
if config.MessageKey != "" {
if !isfirst {
line.AppendString(config.ConsoleSeparator)
}
isfirst = false
line.AppendString(entry.Message)
}
for _, v := range entry.Data {
if v.Key == "" {
continue
}
if !isfirst {
line.AppendString(config.ConsoleSeparator)
}
isfirst = false
line.AppendString(v.Key)
line.AppendString(":")
writetoline(line, v.Value)
}
if entry.Caller.Stack != "" && config.StacktraceKey != "" {
line.AppendString("\n")
line.AppendString(entry.Caller.Stack)
}
line.AppendString("\n")
return line, nil
}
func writetoline(line *pools.Buffer, v interface{}) {
switch v := v.(type) {
case nil:
line.AppendString("nil")
case string:
line.AppendString(v)
case []byte:
line.AppendBytes(v)
case int:
line.AppendInt(int64(v))
case int8:
line.AppendInt(int64(v))
case int16:
line.AppendInt(int64(v))
case int32:
line.AppendInt(int64(v))
case int64:
line.AppendInt(int64(v))
case uint:
line.AppendUint(uint64(v))
case uint8:
line.AppendUint(uint64(v))
case uint16:
line.AppendUint(uint64(v))
case uint32:
line.AppendUint(uint64(v))
case uint64:
line.AppendUint(uint64(v))
case float32:
line.AppendFloat(float64(v), 64)
case float64:
line.AppendFloat(v, 64)
case bool:
line.AppendBool(v)
case time.Time:
line.AppendTime(v, time.RFC3339Nano)
case time.Duration:
line.AppendInt(v.Nanoseconds())
default:
d, _ := json.Marshal(v)
line.AppendBytes(d)
}
}