Skip to content

Commit dc9a791

Browse files
committed
feat: 添加普通文本日志,支持高亮
1 parent 94fbce4 commit dc9a791

File tree

2 files changed

+130
-2
lines changed

2 files changed

+130
-2
lines changed

logger.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,98 @@ func NewJSONLogger(opts ...Option) (*zap.Logger, error) {
220220
return log, nil
221221
}
222222

223+
// NewTextLogger return a simple-encoder zap logger,
224+
func NewTextLogger(opts ...Option) (*zap.Logger, error) {
225+
opt := &option{level: DefaultLevel, fields: make(map[string]string)}
226+
for _, f := range opts {
227+
f(opt)
228+
}
229+
230+
timeLayout := DefaultTimeLayout
231+
if opt.timeLayout != "" {
232+
timeLayout = opt.timeLayout
233+
}
234+
235+
// similar to zap.NewProductionEncoderConfig()
236+
encoderConfig := zapcore.EncoderConfig{
237+
TimeKey: "time",
238+
LevelKey: "level",
239+
NameKey: "logger", // used by logger.Named(key); optional; useless
240+
CallerKey: "caller",
241+
MessageKey: "msg",
242+
StacktraceKey: "stacktrace", // use by zap.AddStacktrace; optional; useless
243+
LineEnding: zapcore.DefaultLineEnding,
244+
EncodeLevel: zapcore.LowercaseLevelEncoder, // 小写编码器
245+
EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
246+
enc.AppendString(t.Format(timeLayout))
247+
},
248+
EncodeDuration: zapcore.MillisDurationEncoder,
249+
EncodeCaller: zapcore.ShortCallerEncoder, // 全路径编码器
250+
}
251+
252+
if opt.highlighting {
253+
encoderConfig.EncodeLevel = zapcore.LowercaseColorLevelEncoder
254+
}
255+
256+
jsonEncoder := zapcore.NewConsoleEncoder(encoderConfig)
257+
258+
// Initialize atomicLevel with the initial logging level
259+
atomicLevel = zap.NewAtomicLevelAt(opt.level)
260+
261+
// lowPriority usd by info\debug\warn
262+
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
263+
return lvl >= atomicLevel.Level() && lvl < zapcore.ErrorLevel
264+
})
265+
266+
// highPriority usd by error\panic\fatal
267+
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
268+
return lvl >= atomicLevel.Level() && lvl >= zapcore.ErrorLevel
269+
})
270+
271+
stdout := zapcore.Lock(os.Stdout) // lock for concurrent safe
272+
stderr := zapcore.Lock(os.Stderr) // lock for concurrent safe
273+
274+
core := zapcore.NewTee()
275+
276+
if !opt.disableConsole {
277+
core = zapcore.NewTee(
278+
zapcore.NewCore(jsonEncoder,
279+
zapcore.NewMultiWriteSyncer(stdout),
280+
lowPriority,
281+
),
282+
zapcore.NewCore(jsonEncoder,
283+
zapcore.NewMultiWriteSyncer(stderr),
284+
highPriority,
285+
),
286+
)
287+
}
288+
289+
if opt.file != nil {
290+
core = zapcore.NewTee(core,
291+
zapcore.NewCore(jsonEncoder,
292+
zapcore.AddSync(opt.file),
293+
zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
294+
return lvl >= atomicLevel.Level()
295+
}),
296+
),
297+
)
298+
}
299+
300+
log := zap.New(core,
301+
zap.AddCaller(),
302+
zap.ErrorOutput(stderr),
303+
)
304+
305+
for key, value := range opt.fields {
306+
log = log.WithOptions(zap.Fields(zapcore.Field{Key: key, Type: zapcore.StringType, String: value}))
307+
}
308+
309+
// 给全局logger对象
310+
logger = log
311+
312+
return log, nil
313+
}
314+
223315
var _ Meta = (*meta)(nil)
224316

225317
// Meta key-value

logger_test.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ func TestNewJSONLogger(t *testing.T) {
2121
WithDisableConsole(),
2222
// 时间格式化
2323
WithTimeLayout("2006-01-02 15:04:05"),
24-
// 高亮
25-
WithEnableHighlighting(),
2624
)
2725
if err != nil {
2826
t.Fatal(err)
@@ -48,8 +46,43 @@ func TestNewJSONLogger(t *testing.T) {
4846
Error("err occurs", zap.String("key", "err.Error()"))
4947
}
5048

49+
func TestNewTextLogger(t *testing.T) {
50+
logger, err := NewTextLogger(
51+
// 日志等级
52+
WithDebugLevel(),
53+
// 写出的文件
54+
//WithFileRotationP("./log/test.log"),
55+
// 不在控制台打印
56+
//WithDisableConsole(),
57+
// 时间格式化
58+
WithTimeLayout("2006-01-02 15:04:05"),
59+
// 高亮
60+
WithEnableHighlighting(),
61+
)
62+
if err != nil {
63+
t.Fatal(err)
64+
}
65+
66+
defer Sync()
67+
68+
err = errors.New("pkg error")
69+
logger.Error("err occurs", WrapMeta(nil, NewMeta("para1", "value1"), NewMeta("para2", "value2"))...)
70+
logger.Error("err occurs", WrapMeta(err, NewMeta("para1", "value1"), NewMeta("para2", "value2"))...)
71+
72+
logger.Info("err occurs", zap.String("key", "value"))
73+
logger.Warn("err occurs", zap.Any("key", "value"))
74+
logger.Error("err occurs", zap.Int("key", 1))
75+
logger.Debug("err occurs", zap.Int("key", 1))
76+
77+
Debug("err occurs", zap.String("key", "err.Error()"))
78+
Info("err occurs", zap.String("key", "err.Error()"))
79+
Warn("err occurs", zap.String("key", "err.Error()"))
80+
Error("err occurs", zap.String("key", "err.Error()"))
81+
}
82+
5183
func TestAtomicLeve(t *testing.T) {
5284
_, err := NewJSONLogger()
85+
defer Sync()
5386
assert.NoError(t, err)
5487
logger.Info("This is a info message") // This should now be logged
5588
logger.Debug("This is a debug message") // This should now be logged
@@ -78,6 +111,9 @@ func TestAtomicLeve(t *testing.T) {
78111

79112
func TestChangeLevelHandlerFunc(t *testing.T) {
80113
logger, err := NewJSONLogger()
114+
defer func() {
115+
Sync()
116+
}()
81117
assert.NoError(t, err)
82118
logger.Info("This is a info message") // This should now be logged
83119
logger.Debug("This is a debug message") // This should now be logged

0 commit comments

Comments
 (0)