日志怎么看: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.logshow 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 -fless +F
搜关键词 grep
搜关键词看前后文 grep -C 5
看大文件 less
看 systemd 服务日志 journalctl -u xxx -f
按时间范围看 journalctl --since "2h ago"

一条建议:别只用 cat。养成 lesstail 的习惯,能省很多时间。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐