温馨提示×

怎么用Golang写系统日志

小樊
47
2026-07-13 01:16:09
栏目: 编程语言

在 Golang 里写系统日志,常见有几种方式,取决于你是要:

  • 写本地系统日志(如 Linux 的 syslog)
  • 写应用日志文件
  • 兼顾标准输出 + 文件 + 系统日志
  • 生产级日志(推荐)

下面从简单到专业逐步说明。


一、最简单:使用标准库 log

适合简单程序或调试。

package main

import (
    "log"
    "os"
)

func main() {
    log.SetOutput(os.Stdout)
    log.SetPrefix("INFO: ")
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

    log.Println("系统启动成功")
    log.Println("发生了一个普通事件")
}

输出示例

INFO: 2026/01/21 10:00:00 main.go:12: 系统启动成功

✅ 优点:简单
❌ 缺点:不能写 syslog、功能弱


二、写 Linux 系统日志(syslog)

使用 log/syslog(仅 Unix/Linux)

package main

import (
    "log"
    "log/syslog"
)

func main() {
    logger, err := syslog.NewLogger(syslog.LOG_INFO|syslog.LOG_DAEMON, log.Lshortfile)
    if err != nil {
        log.Fatal(err)
    }

    logger.Println("系统服务启动")
    logger.Println("处理用户请求")
}

查看日志

journalctl -f
# 或
tail -f /var/log/syslog

✅ 适合:系统服务、daemon
❌ 不支持 Windows


三、同时写文件 + 标准输出(常见做法)

package main

import (
    "io"
    "log"
    "os"
)

func main() {
    f, err := os.OpenFile("system.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    // 同时输出到终端和文件
    multiWriter := io.MultiWriter(os.Stdout, f)

    log.SetOutput(multiWriter)
    log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

    log.Println("系统初始化完成")
}

四、生产级推荐:使用 log/slog(Go 1.21+)

示例:结构化系统日志

package main

import (
    "log/slog"
    "os"
)

func main() {
    logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
        Level: slog.LevelInfo,
    }))

    logger.Info("系统启动",
        slog.String("version", "1.0"),
        slog.String("env", "production"),
    )

    logger.Error("数据库连接失败",
        slog.String("db", "mysql"),
        slog.String("reason", "timeout"),
    )
}

输出:

time=2026-01-21T10:00:00.000+08:00 level=INFO msg="系统启动" version=1.0 env=production

✅ 优点:

  • 结构化日志
  • 可输出 JSON
  • 官方推荐

五、生产环境最佳实践(推荐组合)

推荐方案

标准输出(容器 / systemd)
   ↓
收集到系统日志 / ELK / Loki

JSON 日志(适合 Docker / K8s)

slog.New(slog.NewJSONHandler(os.Stdout, nil))

六、常见场景选择建议

场景 推荐方式
简单脚本 log
Linux 系统服务 syslog
写日志文件 os.OpenFile + log
新项目 log/slog
微服务 slog + JSON
高性能 zap / zerolog

七、第三方高性能日志(进阶)

Uber Zap(非常常用)

go get go.uber.org/zap
logger, _ := zap.NewProduction()
defer logger.Sync()

logger.Info("系统启动",
    zap.String("env", "prod"),
)

八、总结一句话

  • 学习 / 简单程序log
  • 系统服务syslog
  • 现代 Go 项目log/slog
  • 高性能 / 企业级zap

如果你愿意,我可以:

  • ✅ 帮你写一个 完整系统日志封装
  • ✅ 按 Linux systemd 服务 设计日志方案
  • ✅ 对比 log / slog / zap 性能和用法

你打算用在什么系统上?(Linux / Windows / Docker / K8s)

0