温馨提示×

golang日志在debian如何配置

小樊
45
2026-09-22 09:44:33
栏目: 编程语言

在 Debian 上配置 Golang 日志,通常分两种场景:

  1. Go 程序自身日志(代码内配置)
  2. 系统级日志(journald / rsyslog / logrotate)

下面分别说明。


一、Go 程序自身日志配置

1. 使用标准库 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")
}

✅ 适合简单服务


2. 使用结构化日志(推荐)

使用 logrus

import (
    "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")

二、Debian 系统级日志配置

1. 使用 systemd(journald,推荐)

编写 service 文件

/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

✅ 无需自己管理日志文件
✅ 自动轮转


2. 使用 rsyslog(传统方式)

配置 rsyslog

/etc/rsyslog.d/myapp.conf

if $programname == 'myapp' then /var/log/myapp.log
& stop

重启:

systemctl restart rsyslog

3. 日志轮转(logrotate)

/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 服务名

如果你愿意,可以告诉我:

  • 是 systemd 服务 还是 裸进程
  • 用 logrus / zap / 标准库
  • 是否需要 集中日志(ELK / Loki)

我可以直接帮你写完整配置。

0 踩