在 Debian 上用 Go(Golang)打日志,通常分三层来看:
下面按常见场景讲。
package main
import (
"log"
"os"
)
func main() {
log.SetOutput(os.Stdout)
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("hello debian")
}
常用 flag:
log.Ldatelog.Ltimelog.Lmicrosecondslog.Lshortfilef, _ := os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)
⚠️ Debian 上:
/var/log 需要 root 权限/var/log/myapp/import "github.com/sirupsen/logrus"
log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{})
log.Info("service started")
import "go.uber.org/zap"
logger, _ := zap.NewProduction()
logger.Info("hello", zap.String("env", "debian"))
Debian 10+ 默认用 systemd + journald
log.Println("started")
/etc/systemd/system/myapp.service
[Unit]
Description=My Go App
[Service]
ExecStart=/opt/myapp/myapp
User=myapp
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable myapp
systemctl start myapp
journalctl -u myapp
journalctl -u myapp -f # 实时
journalctl -u myapp --since "1 hour ago"
✅ 优点:
/var/log/myapp/
用 logrotate:
/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
✅ 推荐组合
zap / logrusstdoutsystemd + journaldlogrotate❌ 不推荐
/var/log 根目录如果你愿意,可以告诉我:
我可以给你一套可直接用的模板。