在 Debian 上用 Go 打日志,常见做法有几类:标准库 log、第三方日志库、系统日志(syslog / journald)、以及容器/服务化场景。下面按使用场景给你一个实用性总结。
log适合简单程序、脚本、后台服务。
package main
import (
"log"
"os"
)
func main() {
// 输出到文件
f, err := os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
defer f.Close()
log.SetOutput(f)
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("hello debian log")
}
✅ 优点:无需依赖
❌ 缺点:功能弱(无级别、无轮转)
logrus 或 zapimport (
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetLevel(logrus.InfoLevel)
logrus.WithFields(logrus.Fields{
"module": "server",
}).Info("start server")
}
import "go.uber.org/zap"
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("server started",
zap.String("host", "localhost"),
zap.Int("port", 8080),
)
}
import (
"log"
"log/syslog"
)
func main() {
logger, err := syslog.New(syslog.LOG_INFO|syslog.LOG_DAEMON, "myapp")
if err != nil {
log.Fatal(err)
}
logger.Info("hello from debian")
}
查看日志:
sudo tail -f /var/log/syslog
如果是 systemd 服务,直接输出到 stdout/stderr 即可:
log.Println("hello journal")
创建服务文件:
# /etc/systemd/system/myapp.service
[Unit]
Description=My Go App
[Service]
ExecStart=/opt/myapp/myapp
User=myapp
Restart=always
[Install]
WantedBy=multi-user.target
查看日志:
journalctl -u myapp -f
✅ 这是 Debian 上最推荐的方式
Debian 通常用 logrotate:
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
✅ 最佳组合:
journalctl --output=json > file或:
zap + 文件 + logrotate| 场景 | 推荐方式 |
|---|---|
| 小工具 | log |
| 后台服务 | zap + systemd |
| 系统级服务 | syslog / journal |
| 容器 | stdout + json |
如果你能告诉我:
我可以直接给你一套完整模板(含 systemd + logrotate)。