1. 日志在哪里:Linux日志体系速览
干运维这些年,我见过太多同事一接到“服务挂了”“磁盘满了”“被入侵了”的告警,第一反应是先去翻代码、重启服务,折腾半天才想起来看日志。其实 Linux 系统早已把日志体系搭得明明白白,只要你搞清楚日志文件放在哪、由谁在写、怎么轮转,排障效率能提升一大截。
先说最常见的一类日志文件,多数都在 /var/log 目录下面。这个目录是 Linux 系统日志的默认归宿,不管是 Debian/Ubuntu 系还是 CentOS/RHEL 系,核心日志基本都在这里。常用的几个文件我给你列一下:
/var/log/messages:RHEL/CentOS 系的主日志文件,记录了系统启动、服务启停、内核消息、认证失败等大部分事件。/var/log/syslog:Debian/Ubuntu 系的主日志文件,作用和 messages 一样,也是“万能日志桶”。/var/log/secure:安全相关日志,记录 SSH 登录、sudo 提权、用户切换等关键操作。被暴力破解时翻这个文件比什么都直观。/var/log/auth.log:Ubuntu/Debian 系的安全日志,对应 secure。/var/log/dmesg:内核环缓冲区日志,记录硬件识别、驱动加载、启动报错等。设备不识别、网卡搞不上时,第一条就查它。/var/log/cron:计划任务执行日志,crontab 里任务没跑、执行报错,基本都在这。/var/log/boot.log:系统启动过程日志,排查开机卡死、服务启动失败时有用。
有一个很容易踩的坑是 /var/log/messages 和 /var/log/syslog 并不是同一个东西,底层都是 rsyslog 或 syslog-ng 在写,但不同发行版把它们拆分到了不同文件名。你在一台 Ubuntu 服务器上去 tail messages,大概率什么都没有,因为 Ubuntu 默认写的是 syslog。
除了这些系统级日志,各类服务和应用还有自己的专属日志,比如 Nginx 写在 /var/log/nginx/access.log 和 error.log,MySQL 写在 /var/log/mysql/error.log,Java 应用如果没做日志重定向,一般都在应用启动脚本指定的目录里。这个逻辑不复杂,但刚接触 Linux 的人最容易犯的错,就是一股脑扎进 /var/log 翻找,却忘了查应用自己的日志目录。
这里我再提一个现代 Linux 系统绕不开的话题:systemd。当前几乎所有的主流发行版都用 systemd 管理服务,而 systemd 会接管服务的标准输出和错误输出,统一存到 journald 里去,对应命令 journalctl。也就是说,一个服务即使你自己不写任何日志文件,只要它在 stdout 上打了内容,journalctl -u 服务名 就一定能看到。这其实是排查问题时最不该漏掉的入口。
一句话总结日志体系两层结构:传统文本日志(/var/log 下按文件管理)加 journald 二进制日志(journalctl 查询)。前者适合文件级处理、日志采集,后者适合快速按服务、按时间过滤排查。理解了这个大框架,接下来谈各种查看命令才有底。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 查看日志的核心命令实战
2.1 最常用的三个命令:tail、grep、less
看日志离不开这三个命令,但每个命令都有自己的打开方式,不能乱用。
tail 是我日常敲得最多的命令,没有之一。默认显示文件的最后 10 行,这个用法试日志最省事。但真正进入生产排障模式后,重点其实在 -f 参数上,tail -f 会持续跟踪文件输出,新写入的日志会实时滚动出来,非常适合观察服务启动过程、查看实时请求量。
我先给几个高频组合:
bash复制# 查看最后 100 行日志
tail -n 100 /var/log/syslog
# 持续跟踪日志输出
tail -f /var/log/nginx/access.log
# 跟踪时过滤关键字
tail -f /var/log/syslog | grep "ERROR"
# 查看最后 500 行并退出,适合排查大量报错时的快照
tail -n 500 /var/log/messages
这里有个细节很关键:tail -f 适合跟踪,但如果你把整个历史日志从头 cat 出来,那就灾难了。日志文件动辄几个 G,cat 一遍直接刷屏,还会让 SSH 会话卡屏,正确姿势是先用 wc -l 看下文件行数,再用 tail -n 取尾部一段。
grep 的价值是过滤。日志文件动辄几千行,直接看会看瞎眼,用关键字收缩范围是基本操作。比如排查 Nginx 的 500 错误:
bash复制grep " 500 " /var/log/nginx/access.log
但 grep 的本事远不止一个关键字搜索,常见的几个有用参数:
bash复制# 带行号输出,定位更精准
grep -n "OutOfMemoryError" /var/log/app.log
# 忽略大小写,日志里 ERROR 和 error 都要捞出来
grep -i "error" /var/log/syslog
# 只输出匹配的文件名,多个日志一起搜时很好用
grep -l "panic" /var/log/*.log
# 用正则做复杂匹配,比如匹配所有 5xx 状态码
grep -E "HTTP/1.1\" [5][0-9][0-9]" /var/log/nginx/access.log
不过真在超大文件上做筛选,grep 有更好的搭档——less。很多人不知道,less 不仅是个分页器,它还支持直接打开大文件后进入搜索模式,翻页和搜索可以无缝切换。我的习惯是先用 less 打开日志,然后 / 键输入关键字搜索,按 n 跳到下一个匹配项,按 N 回到上一个,配合 G 跳到最后一行,比反复执行 grep 和 tail 舒服得多。
bash复制less /var/log/syslog
# 在 less 界面内:/ERROR 按 n 下一个匹配,按 N 上一个
2.2 journalctl:systemd 时代的日志查看方式
再说 journalctl。现在写服务排障的文章,如果不提 journalctl,基本等于没跟上时代。几乎所有 systemd 托管的服务,stdout 和 stder
