在 Golang 里写系统日志,常见有几种方式,取决于你是要:
下面从简单到专业逐步说明。
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、功能弱
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
✅ 优点:
标准输出(容器 / systemd)
↓
收集到系统日志 / ELK / Loki
slog.New(slog.NewJSONHandler(os.Stdout, nil))
| 场景 | 推荐方式 |
|---|---|
| 简单脚本 | log |
| Linux 系统服务 | syslog |
| 写日志文件 | os.OpenFile + log |
| 新项目 | log/slog |
| 微服务 | slog + JSON |
| 高性能 | zap / zerolog |
go get go.uber.org/zap
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("系统启动",
zap.String("env", "prod"),
)
logsysloglog/slogzap如果你愿意,我可以:
log / slog / zap 性能和用法你打算用在什么系统上?(Linux / Windows / Docker / K8s)