Golang应用的日志输出目标(控制台、文件、系统日志)决定了查询方法,需先确认应用的日志配置(如是否输出到文件、是否使用systemd服务)。
若应用未配置日志文件,默认会将日志输出到终端(标准输出stdout或标准错误stderr)。若应用在前台运行(如通过./myapp启动),可直接看到日志;若应用在后台运行(如通过nohup ./myapp &),可通过以下命令查看:
# 查看后台进程的日志(需替换为实际进程ID)
tail -f nohup.out
或通过ps命令找到进程ID,再用tail -f /proc/<PID>/fd/1查看标准输出。
若应用配置了日志文件(如使用log.SetOutput或第三方库写入文件),可通过以下命令查看:
# 查看日志文件末尾(默认显示最后10行)
tail /path/to/your/app.log
# 实时跟踪日志更新(新增内容会动态显示)
tail -f /path/to/your/app.log
# 查看完整日志文件(适合小文件)
cat /path/to/your/app.log
# 分页查看日志(适合大文件,按空格翻页)
less /path/to/your/app.log
例如,若日志路径为/var/log/myapp.log,则使用tail -f /var/log/myapp.log实时查看。
若应用以systemd服务运行(如服务名为myapp.service),日志会被systemd捕获,可通过journalctl命令查询:
# 查看特定服务的所有日志
journalctl -u myapp.service
# 实时跟踪服务日志更新
journalctl -u myapp.service -f
# 查看服务本次启动后的日志
journalctl -u myapp.service -b
# 查看特定时间范围的日志(如2025-06-01至2025-06-02)
journalctl -u myapp.service --since "2025-06-01" --until "2025-06-02"
# 搜索包含关键字的日志(如"error")
journalctl -u myapp.service | grep "error"
注:需替换myapp.service为实际服务名(可通过systemctl list-units --type=service查看)。
无论日志存储在文件还是journal中,均可通过以下命令筛选关键信息:
# 过滤包含"error"关键字的日志行
grep "error" /path/to/your/app.log
journalctl -u myapp.service | grep "error"
# 排除包含"debug"关键字的日志行(显示其他内容)
grep -v "debug" /path/to/your/app.log
# 查看最近100条日志
tail -n 100 /path/to/your/app.log
为避免日志文件过大,建议配置日志轮转(如使用lumberjack库或logrotate工具):
lumberjack库(第三方日志库如logrus、zap常用),示例代码:import "gopkg.in/natefinch/lumberjack.v2"
func main() {
logger := &lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志文件路径
MaxSize: 10, // 单个文件最大10MB
MaxBackups: 3, // 保留3个备份
MaxAge: 28, // 保留28天
Compress: true, // 压缩旧日志
}
log.SetOutput(logger)
}
logrotate工具配置(编辑/etc/logrotate.d/myapp文件),示例配置:/var/log/myapp.log {
daily # 每天轮转
rotate 7 # 保留7个备份
compress # 压缩旧备份
missingok # 文件不存在时不报错
notifempty # 文件为空时不轮转
}
执行logrotate -f /etc/logrotate.d/myapp可手动触发轮转。sudo提升权限(如sudo tail -f /var/log/myapp.log)。logrus、zap),可通过配置日志级别(如logger.SetLevel(logrus.InfoLevel))过滤无关日志,减少查询量。