Linux下Golang日志存储方案
一 核心方案与适用场景
二 本地文件与轮转实现
标准库 log 写文件
package main
import (
"log"
"os"
)
func main() {
f, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil { log.Fatal(err) }
defer f.Close()
log.SetOutput(f)
log.Println("hello, local file log")
}
使用 lumberjack 做按大小轮转(配合 zap/logrus)
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
cfg := zap.NewProductionEncoderConfig()
cfg.TimeKey = "ts"
cfg.EncodeTime = zapcore.ISO8601TimeEncoder
core := zapcore.NewCore(
zapcore.NewJSONEncoder(cfg),
zapcore.AddSync(&lumberjack.Logger{
Filename: "./logs/app.log",
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 28, // days
Compress: true,
}),
zap.InfoLevel,
)
logger := zap.New(core, zap.AddCaller())
defer logger.Sync()
logger.Info("logged via lumberjack", zap.String("mod", "demo"))
}
使用 file-rotatelogs 按时间轮转(配合 logrus)
package main
import (
"github.com/sirupsen/logrus"
"github.com/lestrrat-go/file-rotatelogs"
"time"
)
func main() {
logFile := "app.log"
rl, err := file-rotatelogs.New(
logFile+".%Y%m%d",
file-rotatelogs.WithLinkName(logFile),
file-rotatelogs.WithMaxAge(7*24*time.Hour),
file-rotatelogs.WithRotationTime(24*time.Hour),
)
if err != nil { panic(err) }
defer rl.Close()
logrus.SetOutput(rl)
logrus.SetLevel(logrus.InfoLevel)
logrus.Info("rotating by time with file-rotatelogs")
}
三 系统日志与集中式平台
四 目录权限与运维策略
/var/log/your-app/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
copytruncate
postrotate
systemctl reload your-app.service >/dev/null 2>&1 || true
endscript
}
说明:
五 性能与安全最佳实践