優先選用針對性能優化的第三方日志庫,避免使用標準庫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數量);