首页 新闻 会员 周边 捐助

go zap 日志输出,求大佬解答

0
悬赏园豆:5 [待解决问题]

现在的日志是按级别输出,比如 debug 级别,会输出所有的日志,会输出debug及以上级别的日志。

但是我想按不同级别输出到不同的文件,即 debug级别的日志输出到 debug.log文件,而不是所有级别的日志。

error级别的日志,输出到 error.log文件。

 

现在的情况是 error级别的日志会输出到 error.log文件,但是也同时会输出到 debug.log 文件中。有办法解决吗

 

还是说我需要创建多个 zap logger 实例

go
暖暖De幸福的主页 暖暖De幸福 | 初学一级 | 园豆:5
提问于:2025-03-23 12:27
< > 人人可用的开源BI工具
分享
所有回答(1)
0
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
}

异地远程联网技术 | 园豆:742 (小虾三级) | 2025-03-24 10:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册
Top