在 Debian 上配置 Golang 日志,通常分两种场景:
下面分别说明。
log最简单的用法:
package main
import (
"log"
"os"
)
func main() {
file, err := os.OpenFile("/var/log/myapp.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.SetOutput(file)
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("server started")
}
✅ 适合简单服务
logrusimport (
"github.com/sirupsen/logrus"
"io"
"os"
)
func init() {
file, _ := os.OpenFile("/var/log/myapp.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
logrus.SetOutput(io.MultiWriter(os.Stdout, file))
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetLevel(logrus.InfoLevel)
}
zap(高性能)logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("started")
/etc/systemd/system/myapp.service
[Unit]
Description=My Go App
After=network.target
[Service]
ExecStart=/opt/myapp/myapp
WorkingDirectory=/opt/myapp
User=myapp
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
journalctl -u myapp -f
✅ 无需自己管理日志文件
✅ 自动轮转
/etc/rsyslog.d/myapp.conf
if $programname == 'myapp' then /var/log/myapp.log
& stop
重启:
systemctl restart rsyslog
/etc/logrotate.d/myapp
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
测试:
logrotate -d /etc/logrotate.d/myapp
| 场景 | 推荐方式 |
|---|---|
| 现代 Debian | systemd + journald |
| 需要文件日志 | Go 写文件 + logrotate |
| 微服务 | zap / logrus + JSON |
| 排错 | journalctl -u 服务名 |
如果你愿意,可以告诉我:
我可以直接帮你写完整配置。