现在的日志是按级别输出,比如 debug 级别,会输出所有的日志,会输出debug及以上级别的日志。
但是我想按不同级别输出到不同的文件,即 debug级别的日志输出到 debug.log文件,而不是所有级别的日志。
error级别的日志,输出到 error.log文件。
现在的情况是 error级别的日志会输出到 error.log文件,但是也同时会输出到 debug.log 文件中。有办法解决吗
还是说我需要创建多个 zap logger 实例
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
func main() {
logger := NewLogger()
defer logger.Sync() // 确保缓冲区的日志被写入文件
logger.Debug("This is a debug message")
logger.Info("This is an info message")
logger.Warn("This is a warning message")
logger.Error("This is an error message")
}
func NewLogger() *zap.Logger {
// 创建不同级别的日志文件
debugFile, _ := os.OpenFile("debug.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
errorFile, _ := os.OpenFile("error.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
// 创建 WriteSyncer
debugWS := zapcore.AddSync(debugFile)
errorWS := zapcore.AddSync(errorFile)
// 设置不同级别的日志写入不同文件
debugLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl == zapcore.DebugLevel
})
errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl == zapcore.ErrorLevel
})
// 定义编码器(使用 JSON 也可以)
encoderConfig := zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
MessageKey: "msg",
CallerKey: "caller",
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeLevel: zapcore.CapitalLevelEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
encoder := zapcore.NewConsoleEncoder(encoderConfig)
// 创建多个 core
debugCore := zapcore.NewCore(encoder, debugWS, debugLevel)
errorCore := zapcore.NewCore(encoder, errorWS, errorLevel)
// 使用 zapcore.NewTee 组合多个 core
logger := zap.New(zapcore.NewTee(debugCore, errorCore), zap.AddCaller())
return logger
}