Golang 日志在 CentOS 的性能调优指南
一 核心原则与瓶颈定位
二 应用层优化要点
三 输出与系统层优化
四 示例配置
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
)
func newZapLogger() *zap.Logger {
// 生产环境 Encoder 配置(JSON)
encCfg := zap.NewProductionEncoderConfig()
encCfg.EncodeTime = zapcore.ISO8601TimeEncoder
// 文件输出 + 轮转
writer := &lumberjack.Logger{
Filename: "/var/log/myapp.log", // 确保目录可写
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 28, // 天
Compress: true,
}
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encCfg),
zapcore.AddSync(writer), // 可再包装为 bufio.Writer 提升吞吐
zap.InfoLevel,
)
return zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
}
package main
import (
"bufio"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
"time"
)
func newAsyncZapLogger() *zap.Logger {
encCfg := zap.NewProductionEncoderConfig()
encCfg.EncodeTime = zapcore.ISO8601TimeEncoder
// 使用 bufio.Writer 做缓冲;可按需进一步封装批量 flush
file, _ := os.OpenFile("/var/log/myapp-async.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
writer := bufio.NewWriterSize(file, 64<<10) // 64KB 缓冲
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encCfg),
zapcore.AddSync(writer),
zap.InfoLevel,
)
logger := zap.New(core, zap.AddCaller())
go func() {
// 简单定时 flush;生产可用更完善的批量/超时策略
for range time.Tick(1 * time.Second) {
_ = writer.Flush()
}
}()
return logger
}
package main
import (
"log"
"os"
)
func init() {
f, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)
log.SetFlags(log.LstdFlags | log.Lshortfile | log.LUTC) // 精简且可解析
}
五 监控与验证