如何在CentOS上查看Golang日志
在CentOS上排查Golang应用的日志,其实没有固定的“万能钥匙”——关键要看应用是怎么输出日志的。是写到了文件里,还是直接扔给了标准输出/错误?是通过systemd跑的,还是装在Docker容器里?下面针对几种常见场景,把对应的查看方法拆开来说。

1. 直接查看日志文件(最常见场景)
如果Golang应用通过log.SetOutput()把日志写到了文件里(比如app.log),那操作就非常直接了:
- 想看完整内容:
cat /path/to/app.log(记得把路径换成实际日志文件的绝对路径) - 想实时追着新日志走:
tail -f /path/to/app.log,按Ctrl+C停 - 想一页一页翻着看:
less /path/to/app.log,看完按q退出 - 只想看错误相关的:
grep "ERROR" /path/to/app.log,只显示包含“ERROR”的行
这里有个小坑——如果应用代码里没有显式指定日志路径,日志可能会默认输出到应用的工作目录。可以用os.Getwd()在代码里获取当前目录,或者干脆全局搜一把:find / -name "*.log" 2>/dev/null。
2. 通过systemd服务查看(推荐生产环境使用)
生产环境下很多应用都是当作systemd服务来管理的(服务文件在/etc/systemd/system/yourapp.service)。这种情况下,需要先在服务文件里配置日志重定向:
- 在
[Service]段追加配置,把标准输出和错误追加到指定文件:
或者更“干净”一点,直接交给systemd的日志系统(不用手动指定文件):StandardOutput=append:/var/log/yourapp.logStandardError=append:/var/log/yourapp.logStandardOutput=syslogStandardError=syslogSyslogIdentifier=my-golang-app - 配置改完,需要重载并重启服务:
sudo systemctl daemon-reloadsudo systemctl restart yourapp - 查看日志就用
journalctl:
还可以加上时间过滤(比如sudo journalctl -u yourapp -f # -u指定服务名,-f实时刷新--since "2025-10-01")或者关键字过滤(比如-g "panic"),非常灵活。
3. 查看Docker容器中的日志(若应用运行在容器内)
如果应用是跑在Docker容器里的,那就不能直接在宿主机上找文件了,得通过容器来查:
- 先拿到容器ID或名称:
docker ps - 实时看日志:
docker logs -f <容器ID或名称>(按Ctrl+C停止) - 只看最后100行:
docker logs --tail 100 <容器ID或名称>
这个命令会把容器内标准输出/错误的内容拉出来,前提是应用把日志写到了stdout/stderr(Golang推荐的做法之一)。
4. 使用日志收集工具(大规模生产环境)
一旦你的服务上了规模,或者系统是分布式的,单机用tail、grep就有点力不从心了。这个时候,ELK Stack(Elasticsearch+Logstash+Kibana)或者Fluentd这类工具就是标配。思路很简单:在应用中把日志输出到工具采集的端点(比如Logstash的TCP/UDP端口),然后由工具统一收集、索引、搜索和可视化。一台机器上查日志的时代就过去了,你会爱上Kibana的搜索栏的。
注意事项
- 如果怎么也找不到日志,先回头检查应用代码:
os.OpenFile是不是成功了?路径权限对不对?日志配置有没有生效? - 生产环境里,日志文件跑着跑着就可能几GB甚至几十GB,必须做日志轮转(
logrotate是Linux必备,Golang也有第三方库比如lumberjack支持在代码里直接轮转)。别让一个日志文件撑爆磁盘。