|
@@ -38,14 +38,20 @@ type Logger struct {
|
|
|
lv zap.AtomicLevel
|
|
|
|
|
|
// zapcore.Core 映射,存储不同来源/用途的core创建
|
|
|
- cores map[coreType][]zapcore.Core
|
|
|
+ cores map[coreType][]CoreContext
|
|
|
}
|
|
|
|
|
|
func NewLogger() *Logger {
|
|
|
logger := new(Logger)
|
|
|
logger.lv = zap.NewAtomicLevelAt(zap.DebugLevel)
|
|
|
- logger.setCore(console, zapcore.NewCore(consoleEncoder, consoleSync, logger.lv))
|
|
|
- logger.setCore(output, zapcore.NewCore(jsonEncoder, outputSync, logger.lv))
|
|
|
+ logger.setCore(console, CoreContext{
|
|
|
+ Core: zapcore.NewCore(consoleEncoder, consoleSync, logger.lv),
|
|
|
+ Writer: consoleSync,
|
|
|
+ })
|
|
|
+ logger.setCore(output, CoreContext{
|
|
|
+ Core: zapcore.NewCore(jsonEncoder, outputSync, logger.lv),
|
|
|
+ Writer: outputSync,
|
|
|
+ })
|
|
|
logger.flush()
|
|
|
return logger
|
|
|
}
|
|
@@ -141,23 +147,34 @@ func (l *Logger) SetLv(lv Level) {
|
|
|
l.lv.SetLevel(lv.zap())
|
|
|
}
|
|
|
|
|
|
+// NewFileOutput 新增日志输出文件配置
|
|
|
func (l *Logger) NewFileOutput(opts ...FileOutputOpt) {
|
|
|
cfg := new(outFileConfig)
|
|
|
for _, opt := range opts {
|
|
|
opt(cfg)
|
|
|
}
|
|
|
- l.newFileOut(*cfg)
|
|
|
+ l.newOut(&lumberjack.Logger{
|
|
|
+ Filename: cfg.filename,
|
|
|
+ MaxSize: cfg.maxSize,
|
|
|
+ MaxAge: cfg.maxAge,
|
|
|
+ MaxBackups: cfg.maxBackups,
|
|
|
+ LocalTime: cfg.localTime,
|
|
|
+ Compress: cfg.Compress,
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
+// NewOutput 新增日志输出位置
|
|
|
func (l *Logger) NewOutput(writer io.Writer) {
|
|
|
l.newOut(writer)
|
|
|
}
|
|
|
|
|
|
-func (l *Logger) SetCore(core ...zapcore.Core) {
|
|
|
+// AddCore 添加Core
|
|
|
+func (l *Logger) AddCore(core ...CoreContext) {
|
|
|
l.setCore(third, core...)
|
|
|
l.flush()
|
|
|
}
|
|
|
|
|
|
+// Flush 将缓冲区日志刷新至目标
|
|
|
func (l *Logger) Flush() {
|
|
|
err := l.logger.Sync()
|
|
|
if err != nil {
|
|
@@ -165,26 +182,21 @@ func (l *Logger) Flush() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (l *Logger) newFileOut(cfg outFileConfig) {
|
|
|
- l.newOut(&lumberjack.Logger{
|
|
|
- Filename: cfg.filename,
|
|
|
- MaxSize: cfg.maxSize,
|
|
|
- MaxAge: cfg.maxAge,
|
|
|
- MaxBackups: cfg.maxBackups,
|
|
|
- LocalTime: cfg.localTime,
|
|
|
- Compress: cfg.Compress,
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
+// newOut 设置日志写出位置
|
|
|
func (l *Logger) newOut(writer io.Writer) {
|
|
|
- l.setCore(output, zapcore.NewCore(jsonEncoder, zapcore.AddSync(writer), l.lv))
|
|
|
+ l.setCore(output, CoreContext{
|
|
|
+ Core: zapcore.NewCore(jsonEncoder, zapcore.AddSync(writer), l.lv),
|
|
|
+ Writer: writer,
|
|
|
+ })
|
|
|
l.flush()
|
|
|
}
|
|
|
|
|
|
// 保存内部core(不负责刷新 logger)
|
|
|
-func (l *Logger) setCore(ct coreType, core ...zapcore.Core) {
|
|
|
+func (l *Logger) setCore(ct coreType, core ...CoreContext) {
|
|
|
+ l.lock.Lock()
|
|
|
+ defer l.lock.Unlock()
|
|
|
if l.cores == nil {
|
|
|
- l.cores = make(map[coreType][]zapcore.Core)
|
|
|
+ l.cores = make(map[coreType][]CoreContext)
|
|
|
}
|
|
|
l.cores[ct] = append(l.cores[ct], core...)
|
|
|
}
|
|
@@ -195,13 +207,13 @@ func (l *Logger) flush() {
|
|
|
l.lock.Lock()
|
|
|
defer l.lock.Unlock()
|
|
|
|
|
|
- cores := make([]zapcore.Core, 0, len(l.cores))
|
|
|
+ cores := make(coreContexts, 0, len(l.cores))
|
|
|
for _, core := range l.cores {
|
|
|
cores = append(cores, core...)
|
|
|
}
|
|
|
|
|
|
l.logger = *zap.New(
|
|
|
- zapcore.NewTee(cores...),
|
|
|
+ zapcore.NewTee(cores.Cores()...),
|
|
|
zap.AddCaller(),
|
|
|
).Sugar()
|
|
|
}
|