首先需明确Golang应用程序的日志存储位置。若使用标准库log包,默认输出到标准错误(stderr);若通过代码指定(如logFile, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)),则需检查代码中的SetOutput配置。
使用以下命令查看日志内容:
tail -f /path/to/logfile.log(如tail -f /var/log/myapp.log);less /path/to/logfile.log(按q退出);grep -i "error" /path/to/logfile.log(不区分大小写)。systemd服务运行,可通过journalctl -u your-service-name查看系统日志中的关联条目。Golang标准库log包无内置级别控制,需通过自定义函数过滤(如仅输出INFO及以上级别):
const (
DEBUG = iota
INFO
ERROR
)
var currentLevel = INFO
func logWithLevel(level int, msg string) {
if level >= currentLevel {
log.Printf("[LEVEL%d] %s", level, msg)
}
}
若使用第三方库(如logrus、zap),可直接设置级别:
logrus.SetLevel(logrus.InfoLevel)(支持Debug、Info、Warn、Error、Fatal);logger, _ := zap.NewProduction()(生产环境默认Info及以上,开发环境用zap.NewDevelopment()输出Debug)。awk '/error/ {count++} END {print count}' /path/to/logfile.log;sed -n '/error/p' /path/to/logfile.log > errors.log(将错误行保存到新文件);grep "2025-10-26" /path/to/logfile.log | grep "error"(筛选特定时间的错误)。go install github.com/go-delve/delve/cmd/dlv@latest,启动调试:dlv debug your-app.go,通过break main.main设置断点、next单步执行、print variable查看变量值,定位日志未输出或错误发生的代码位置;strace -f -o strace.log ./your-app(记录所有系统调用),分析是否因文件权限(如无法写入日志文件)、网络连接失败等问题导致日志异常;gdb ./your-app,通过run启动程序,bt查看崩溃时的堆栈跟踪,分析日志中断的根本原因。journalctl -xe(查看近期系统日志),结合grep your-app-name筛选与Golang应用相关的日志(如启动失败、权限拒绝);runtime/debug包,添加debug.PrintStack()语句,当出现严重错误(如panic)时,输出当前 goroutine 的堆栈信息,辅助定位问题根源。logrus+lfshook实现日志轮换(避免日志文件过大),示例代码:import (
"github.com/sirupsen/logrus"
"github.com/rifflock/lfshook"
)
func main() {
log := logrus.New()
hook := lfshook.NewHook(lfshook.PathMap{
logrus.InfoLevel: "/var/log/info.log",
logrus.ErrorLevel: "/var/log/error.log",
}, &logrus.JSONFormatter{})
log.Hooks.Add(hook)
log.Info("This is an info message")
log.Error("This is an error message")
}
logrotate(Debian自带)配置日志轮换,编辑/etc/logrotate.conf或创建/etc/logrotate.d/myapp文件,添加:/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
}
```(每天轮换,保留7天压缩日志)。
通过以上步骤,可系统性地排查Debian环境下Golang应用程序的日志问题,从日志输出、级别控制、内容分析到工具辅助,逐步定位并解决问题。