整体思路与分层架构
库选型与快速上手
示例 标准库 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.SetPrefix("INFO: ")
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("hello, standard log")
}
示例 zap 写入文件并轮转(配合 lumberjack)
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
core := zapcore.NewCore(
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
zapcore.AddSync(&lumberjack.Logger{
Filename: "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("hello, zap with rotation")
}
示例 logrus 写入文件并轮转(配合 file-rotatelogs)
package main
import (
"github.com/sirupsen/logrus"
"github.com/lestrrat-go/file-rotatelogs"
"time"
)
func main() {
writer, _ := rotatelogs.New(
"app.log.%Y%m%d",
rotatelogs.WithLinkName("app.log"),
rotatelogs.WithMaxAge(7*24*time.Hour),
rotatelogs.WithRotationTime(24*time.Hour),
)
logrus.SetOutput(writer)
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetLevel(logrus.InfoLevel)
logrus.Info("hello, logrus with rotation")
}
本地存储与轮转策略
/var/log/myapp/app.log {
daily
missingok
rotate 7
compress
notifempty
create 640 myapp myapp
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
集中式日志与运维实践
性能与安全最佳实践