日志怎么看:journalctl / tail / less 实用技巧
日志怎么看:journalctl / tail / less 实用技巧
适合面对几千行日志只会
cat+ 肉眼找的开发 / 运维。
不讲日志框架怎么配,只讲怎么看。
场景
线上服务报错了,你登录服务器要看日志。最常见的做法:
cat app.log | grep ERROR
如果文件不大还行。文件一大,cat 刷屏完全看不清。下面几个工具和技巧,每天都会用到。
tail:实时跟踪和看末尾
实时跟踪
tail -f app.log
日志一行一行输出到终端。一边操作页面,一边看日志刷出来,定位问题很直观。
看最后 N 行
tail -200 app.log
最常用的——报错后切到日志目录,先看看最后发生了什么。
跟踪时过滤
tail -f app.log | grep ERROR
tail -f app.log | grep -v DEBUG # 排除 DEBUG 级别的
tail -f app.log | grep --color Exception
只看跟踪的新行
tail -n 0 -f app.log
从 0 行开始,只显示跟踪后新写入的内容,不会把已有的行都刷出来。
less:看大文件不卡
cat 会把整个文件读到内存然后往终端刷,500MB 日志文件直接就卡死了。
less 只加载当前屏幕的内容,多大文件都不会卡。
less app.log
翻页和搜索
| 按键 | 效果 |
|---|---|
空格 / f |
下一页 |
b |
上一页 |
g |
跳到文件开头 |
G |
跳到文件末尾 |
N G |
跳到第 N 行(如 1000G) |
q |
退出 |
搜索高亮
/ERROR ← 搜索 ERROR,按 n 跳到下一个,N 跳到上一个
?ERROR ← 从当前位置往前搜
&ERROR — 只显示匹配的行(过滤模式),退出后按 & + 回车取消。
行号
-N # 显示行号(也可以在 less 里按 -N 切换)
less -N app.log 进入就能看到行号,方便和同事说"在第 1234 行附近有问题"。
实时跟踪
less +F app.log
进入后按 F(大写),等价于 tail -f。日志更新了自动往下滚。想停下来翻页看细节按 Ctrl+C,看完再按 F 继续跟踪。
grep:从日志里捞关键信息
搜关键词
grep "ERROR" app.log
grep -i "timeout" app.log # 忽略大小写
grep "2026-04-28 10:0[0-5]" app.log # 正则表达式
看上下文
grep -B 5 "ERROR" app.log # 前 5 行
grep -A 10 "ERROR" app.log # 后 10 行
grep -C 5 "ERROR" app.log # 前后各 5 行
最有用的——只看一句 ERROR 不知道怎么回事,看它前后几行才知道什么请求导致的。
多关键词组合
grep "ERROR" app.log | grep "payment" # 同时包含 ERROR 和 payment
grep "ERROR" app.log | grep -v "healthcheck" # 包含 ERROR 但不包含 healthcheck
grep -E "ERROR|FATAL|Exception" app.log # 多个关键词任意匹配
只统计不输出
grep -c "ERROR" app.log # 今天有多少条 ERROR
grep -c "ERROR" app-*.log # 每个文件分别统计
递归搜整目录
grep -r "order_failed" /var/log/myapp/
journalctl:查看 systemd 管理的日志
如果你的服务用 systemctl 管理,journalctl 直接接管了标准输出/标准错误,不需要写日志文件。
基本操作
journalctl -u myapp # 看 myapp 服务的日志
journalctl -u myapp -n 50 # 只看最后 50 行
journalctl -u myapp -f # 实时跟踪
按时间
journalctl -u myapp --since today
journalctl -u myapp --since "2026-04-28 10:00:00"
journalctl -u myapp --since "10 minutes ago"
journalctl -u myapp --since "2026-04-27" --until "2026-04-28"
按严重级别
journalctl -u myapp -p err # 只看 error 级别及以上
journalctl -u myapp -p warning # warning 级别及以上
级别从高到低:emerg > alert > crit > err > warning > notice > info > debug
组合使用
journalctl -u myapp -p err --since "1 hour ago" --no-pager
几个实用组合
1. 从今天中午 12 点到现在的 ERROR
sed -n '/2026-04-28 12:00:00/,$ p' app.log | grep "ERROR"
2. 看最近 30 分钟的日志
journalctl -u myapp --since "30 min ago" --no-pager > /tmp/recent.log
less /tmp/recent.log
3. 请求 ID 追踪
如果应用日志有 traceId/requestId:
grep "req-abc123" app.log
一条请求从进门到离开的所有日志都出来了,比看时间戳猜更准。
4. 看异常频率
grep "ERROR" app.log | awk '{print $1, $2}' | sort | uniq -c | sort -rn | head -10
按每分钟统计 ERROR 条数,能看出是持续报错还是某一秒爆发。
5. 实时监控只过滤某些关键词
tail -f app.log | awk '/ERROR|FATAL|Exception/ {print strftime("%H:%M:%S"), $0}'
加上时间戳,方便截图发给同事。
6. less + grep:跳过无聊的行
用 less 打开文件后,按 & 输入关键词匹配模式,只显示匹配行:
&ERROR # 只显示有 ERROR 的行
&!DEBUG # 排除 DEBUG
按 & 回车取消过滤。
常用日志位置速查
| 软件 | 日志路径 |
|---|---|
| Nginx access | /var/log/nginx/access.log |
| Nginx error | /var/log/nginx/error.log |
| MySQL | /var/log/mysql/error.log 或 show variables like '%log_error%'; |
| systemd 服务 | journalctl -u <服务名> |
| Docker 容器 | docker logs <容器名> |
| syslog | /var/log/syslog (Ubuntu) / /var/log/messages (CentOS) |
| 登录日志 | /var/log/auth.log (Ubuntu) / /var/log/secure (CentOS) |
看完日志别忘了
du -sh /var/log/ # 看日志占了多少磁盘
日志不会自动清理,尤其 journalctl 的日志在 /var/log/journal/ 可能占好几个 G。配置一下:
sudo journalctl --vacuum-size=500M # 只保留 500M 日志
sudo journalctl --vacuum-time=7d # 只保留 7 天日志
想永久限制,在 /etc/systemd/journald.conf 设置:
SystemMaxUse=500M
MaxFileSec=7day
然后重启服务:
sudo systemctl restart systemd-journald
总结
| 需求 | 用什么 |
|---|---|
| 看最后几行 | tail -100 |
| 实时跟踪 | tail -f 或 less +F |
| 搜关键词 | grep |
| 搜关键词看前后文 | grep -C 5 |
| 看大文件 | less |
| 看 systemd 服务日志 | journalctl -u xxx -f |
| 按时间范围看 | journalctl --since "2h ago" |
一条建议:别只用 cat。养成 less 和 tail 的习惯,能省很多时间。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)