Linux 日志排查入门:journalctl、tail 与 dmesg
Linux 日志排查入门:journalctl、tail 与 dmesg
服务突然挂了,服务器突然变慢,第一反应往往是重启。但重启之前先看一眼日志:系统和服务在出事之前,一般都已经把原因写下来了。日志排查就三个动作:journalctl 看系统和服务的记录,tail 盯着正在写的日志文件,dmesg 看内核的消息。学会这三步,出问题先找证据,再决定修哪里。
一、journalctl:先看系统和服务说了什么
用 systemd 的系统,服务日志都集中在 journal 里,journalctl 就是翻这本总账的工具。先看一个服务的最近记录:
journalctl -u nginx --since "1 hour ago"
这行是只看 nginx 这个服务最近一小时的日志。-u 指定服务名,–since 限定时间范围。服务刚挂,时间范围收得越窄,越快找到出事那一刻的记录。
日志太多,想只看报错,可以只翻错误级别以上的:
journalctl -p err --since today
-p err 是只显示错误和更严重的级别,–since today 是只看今天的。满屏的普通信息一下子被过滤掉,剩下的就是真正值得看的几行。
服务正在出问题、想实时看它在写什么,加 -f 跟随输出:
journalctl -u nginx -f
这行会一直盯着 nginx 的新日志,有新记录就实时打出来。复现一次故障,看着日志一行行冒出来,报错出现的位置就是故障发生的位置。看完按 Ctrl+C 退出。
二、tail:盯着正在写的日志文件
不是所有日志都在 journal 里,很多服务还把日志写进文件,比如 /var/log/nginx/error.log。看这种文件,tail 是最直接的工具。先看最后几十行:
tail -n 50 /var/log/nginx/error.log
这行是看文件最后 50 行。服务刚报错,原因一般就藏在文件尾巴这几十行里,不用从头翻到尾。
想实时盯着文件,等报错自己冒出来,加 -f:
tail -f /var/log/nginx/error.log
这行会一直等在文件尾部,有新内容写入就立刻显示。复现一次故障,报错出现的那一刻就能看到,不用事后猜时间点。
只关心报错行,可以先过滤再看:
tail -n 200 /var/log/nginx/error.log | grep -i error
这行是先取最后 200 行,再只留下带 error 的行。-i 是忽略大小写,Error、ERROR 都能抓到。日志文件动不动几万行,先过滤再读,比逐行翻快得多。
三、dmesg:看内核的消息
有些问题不在服务层,在更底层:磁盘报错、内存不足、网卡掉线,这些都写在内核日志里,dmesg 就是读它的工具。先看最近的内核消息:
dmesg | tail -n 30
这行是看内核日志的最后 30 行。磁盘读写报错、内存被耗尽杀进程(OOM),都会先出现在这里。
只看和磁盘有关的消息,可以过滤:
dmesg | grep -i -E "disk|sd[a-z]|I/O error"
这行是只留带磁盘关键词的行。磁盘刚出过错,这里会有明确的读写失败记录;服务层只会报超时,原因要到内核日志里找。
时间太久的内核消息不好定位,加 -T 显示人类可读的时间:
dmesg -T | tail -n 20
-T 是把内核启动后的相对秒数换算成日期时间。看到一条报错,先对一下它发生的时间,再去翻同一时间的服务日志,两边对上了,故障链条就完整了。
四、三个新手常踩的坑
第一,出问题只看报错那一行。单行报错常常只说结果不说原因,往上翻十几行,经常能看到真正的原因:比如服务重启前其实已经连不上数据库了。看到报错先往上翻,别只盯着最后一行。
第二,日志级别不分就全看。服务日志里九成是正常信息,全看等于大海捞针。先用级别过滤(-p err)或关键词过滤(grep),把范围收窄到报错附近,再精读那几十行。
第三,服务日志和系统日志只看一边。服务说连不上,可能是服务自己的配置错了,也可能是系统层面的磁盘满了、内存耗尽了。journalctl、tail、dmesg 三个都看过,互相印证,才算查完整;只看一边,很容易把系统问题当成服务问题修错方向。
journalctl 看系统和服务的记录,tail 盯着正在写的日志文件,dmesg 看内核的消息。三步走完,先找到出事那一刻的记录,再决定修哪里。服务下次再挂,先花一分钟翻一翻日志,再决定是重启、改配置,还是修底层的问题。
- 点赞
- 收藏
- 关注作者
评论(0)