优先选用针对性能优化的第三方日志库,避免使用标准库log(功能简单但性能有限)。zap(Uber开源)和zerolog(零分配设计)是Golang社区公认的高性能选择:
根据环境调整日志级别,过滤不必要的日志输出:
WARN或ERROR,仅记录错误、警告等关键信息,避免DEBUG/INFO级别的冗余日志(如请求详情、内部状态);DEBUG,便于排查问题,但需在上线前切换回高日志级别。zap.NewProduction()默认开启INFO级别,或通过config.Level.SetLevel(zap.WarnLevel)手动调整。通过异步方式将日志写入磁盘,避免日志操作阻塞主线程。常见实现方法:
zapcore.AddSync可结合lumberjack.Logger实现异步批量写入,zerolog也支持异步模式。将多个日志消息合并后批量写入磁盘,减少系统调用次数(如每次写入100条日志而非1条):
zapcore.AddSync包装带缓冲的writer(如bufio.Writer),或通过日志库的批量配置(如zap的BatchTimeout设置批量写入间隔);lumberjack.Logger(第三方日志轮转库),其内置缓冲机制可自动合并日志条目,同时支持日志切割(见下文)。避免单个日志文件过大(如超过1GB),导致磁盘读写性能下降。使用lumberjack.Logger实现自动切割:
Filename(日志路径)、MaxSize(单个文件最大大小,单位MB)、MaxBackups(保留的旧日志文件数量)、MaxAge(保留天数)、Compress(是否压缩旧日志);logger, _ := zap.NewProduction()
defer logger.Sync()
lumberjackLogger := &lumberjack.Logger{
Filename: "/var/log/myapp.log",
MaxSize: 100, // 100MB
MaxBackups: 3, // 保留3个旧文件
MaxAge: 28, // 保留28天
Compress: true, // 压缩旧文件
}
logger = logger.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core {
return zapcore.NewCore(core.Encoder(), zapcore.AddSync(lumberjackLogger), core.Level())
}))
日志轮转可防止磁盘空间耗尽,同时保持日志文件的可管理性。避免记录冗余或无用的信息,降低日志量:
if logger.GetLevel() <= zap.DebugLevel { logger.Debug("debug message") });zap.String("user_id", "123"))替代拼接字符串,减少内存分配和解析开销;DEBUG级别的详细日志(如请求参数、内部流程),仅保留ERROR和WARN。调整CentOS系统配置,提升日志处理能力:
/etc/rsyslog.conf减少不必要的模块加载(如注释掉imklog),或调整WorkDirectory(工作目录)到更快的存储设备(如SSD);vm.dirty_ratio(脏页比例,建议5%-10%)和vm.dirty_background_ratio(后台刷脏页比例,建议2%-5%),控制日志写入磁盘的频率,避免频繁I/O;通过监控工具识别日志性能瓶颈:
pprof分析日志模块的CPU和内存占用(如go tool pprof http://localhost:6060/debug/pprof/profile),找出热点函数(如日志写入、序列化);sar(系统活动报告)、iostat(磁盘I/O统计)监控系统资源使用情况,若磁盘I/O等待时间过高,需优化日志写入策略(如增加批量大小、调整异步Goroutine数量);