温馨提示×

Golang日志在Linux如何分类

小樊
36
2026-01-01 21:27:18
栏目: 编程语言

Golang 日志在 Linux 的分类实践

一 分类维度与落地要点

  • 按级别:使用 DEBUG/INFO/WARN/ERROR 等分级,便于在不同环境控制输出量与筛选问题。
  • 按模块/业务域:为日志增加 category(如 database、network、auth),同一次请求在不同模块打同类标签,便于聚合分析。
  • 按输出目的地:区分 控制台(开发/调试)、文件(持久化)、集中式系统(如 ELK/Graylog)等。
  • 按时间/大小:按 天/小时文件大小 切分,避免单文件过大,便于归档与检索。
  • 按结构:优先 结构化日志(JSON),包含 timestamp、level、msg、category、trace_id 等字段,利于检索、聚合与链路追踪。
  • 按访问与业务:后端服务可同时输出 业务日志访问日志(如 Nginx/自定义 access log),分别用于业务排错与流量分析。

二 分类落地的最小实践示例

  • 使用 log/slog(Go 1.21+) 输出结构化日志,并按模块打 category 标签;结合 file-rotatelogs 按天切分日志文件。
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")
}
  • 要点:
    • 通过 category 字段实现“按模块/业务域”分类;
    • 使用 JSONFormatterslog 的 JSONHandler 统一字段;
    • 通过 file-rotatelogs 按时间切分,避免单文件过大。

三 系统侧分类与运维策略

  • 日志轮转与清理:使用 logrotate 管理按时间/大小切分后的日志,支持压缩、归档与自动清理,防止磁盘被占满。
  • 权限与合规:设置合适的日志文件权限(如仅属主读写),对含敏感信息的日志考虑 加密存储访问审计
  • 集中式收集与分析:将各节点日志统一发送到 ELK/Graylog 或兼容系统,便于检索、可视化与告警。
  • 访问日志分析:对 Nginx/自定义 access log 使用 goaccess 生成可视化报表,洞察流量与错误趋势。
  • 监控与告警:结合 Prometheus/Grafana 对日志量、错误率等指标做监控与阈值告警。

四 分类打标与字段规范建议

  • 统一字段集合:至少包含 timestamp、level、msg、category、trace_id;必要时补充 file、line、method、uri、status、latency_ms、error
  • 请求链路:在入口生成并透传 trace_id,贯穿业务、数据库、外部调用,便于端到端追踪。
  • 错误分类:在错误日志中显式写入 category(如 database、network、auth),并在错误路径上保持一致的标签策略。
  • 采样与降噪:对高频 DEBUG 日志按需采样,避免影响性能与成本。
  • 命名与目录:按服务/模块划分目录与文件名,例如 /var/log/myapp/serviceA/error.log/var/log/myapp/serviceA/access.log

0