Golang 日志在 Linux 的分类实践
一 分类维度与落地要点
二 分类落地的最小实践示例
package main
import (
"context"
"log/slog"
"os"
"time"
"github.com/lestrrat-go/file-rotatelogs"
"golang.org/x/exp/slog"
)
func newLogger(logPath string) *slog.Logger {
// 按天轮转:保留 7 天,每 24 小时切分
writer, err := rotatelogs.New(
logPath+".%Y%m%d",
rotatelogs.WithLinkName(logPath),
rotatelogs.WithMaxAge(7*24*time.Hour),
rotatelogs.WithRotationTime(24*time.Hour),
)
if err != nil {
panic(err)
}
h := slog.NewJSONHandler(writer, &slog.HandlerOptions{
Level: slog.LevelInfo,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
// 统一时间格式
if a.Key == slog.TimeKey {
return slog.Attr{Key: a.Key, Value: slog.StringValue(a.Value.Time().Format("2006-01-02 15:04:05"))}
}
return a
},
})
return slog.New(h)
}
func main() {
logger := newLogger("./logs/app.log")
ctx := context.Background()
// 按模块打标签(category)
logger.InfoContext(ctx, "user login", "category", "auth", "user_id", 1001, "ip", "192.168.1.10")
logger.ErrorContext(ctx, "db query failed", "category", "database", "query", "SELECT ...", "error", "timeout")
}
三 系统侧分类与运维策略
四 分类打标与字段规范建议