在 CentOS 上优化 Golang 应用日志的实用方案
一 核心优化策略
二 落地配置示例
高性能 JSON 日志(zap + 轮转)
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
)
func newZapLogger() *zap.Logger {
// 动态级别:生产默认 INFO,可按需调高/调低
atomicLevel := zap.NewAtomicLevelAt(zap.InfoLevel)
encoderConfig := zapcore.EncoderConfig{
TimeKey: "ts",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.CapitalLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.MillisDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log", // 确保目录可写
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 28, // 天
Compress: true,
}),
atomicLevel,
)
return zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
}
func main() {
logger := newZapLogger()
defer logger.Sync()
logger.Info("service started", zap.String("version", "1.2.3"))
logger.Warn("disk usage high", zap.Float64("usage", 92.5))
logger.Error("db query failed", zap.Error(fmt.Errorf("timeout")))
}
标准库快速优化(适合轻量服务)
package main
import (
"log"
"os"
)
func main() {
f, err := os.OpenFile("/var/log/myapp/std.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil { panic(err) }
defer f.Close()
log.SetOutput(f)
log.SetFlags(log.LstdFlags | log.Lshortfile | log.LUTC)
log.Println("hello, standard logger")
}
三 系统侧日志轮转与采集
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 myapp myapp
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP myapp.service >/dev/null 2>&1 || true
endscript
}
postrotate 发送 SIGHUP 通知进程重新打开日志文件(若程序支持)。四 性能与安全最佳实践