
服务器出问题的时候,你第一反应是什么?
大部分人要么重启,要么上网搜错误码,要么直接找运维朋友救命。但其实服务器自己早就把问题写下来了,就藏在某个角落——日志文件里。
日志是服务器的黑匣子。它记下了每一次心跳、每一次喘息、每一次崩溃前的惨叫。问题是你得听得懂它在说什么。
很多人面对日志的第一反应是:太多了,从哪看?全是英文,看不懂。别急,今天咱们就聊聊,怎么从一堆乱麻似的日志里,快速捞出那条真正有用的线索。
日志都藏在哪?
先搞清楚你的服务器把日记本放哪了。不同系统、不同服务,日志位置不太一样,但有几个地方是通用的:
- 系统日志:
/var/log/messages(CentOS/RHEL)或/var/log/syslog(Ubuntu/Debian)。系统内核、各种服务跑的时候,有什么想说的都往这写。 - 认证日志:
/var/log/secure(CentOS)或/var/log/auth.log(Ubuntu)。谁登录了、谁试图登录、登录成功还是失败,都在这。 - Web 日志:Nginx 一般在
/var/log/nginx/access.log和error.log;Apache 类似,在/var/log/httpd/或/var/log/apache2/。 - 数据库日志:MySQL 的 error log 可能在
/var/log/mysql/error.log,慢查询日志需要自己开启。 - 应用日志:你自己部署的程序,一般会在代码里指定日志路径,比如
/var/log/myapp/。
知道它们在哪儿,就等于拿到了钥匙。
三个最常用的命令,比鼠标好用一万倍
在服务器上翻日志,不能用鼠标拖滚动条。你得用命令行,因为快、准、狠。
grep —— 从海量日志里捞关键词
假设你的网站报 500 错误,你想看看 Nginx 的错误日志里有没有线索:
bash
grep -i error /var/log/nginx/error.log
-i 的意思是忽略大小写,因为有时候错误写的是 Error,有时候是 ERROR,大小写不定。
但这只是最基础的用法。真正有用的是看上下文:
bash
grep -A5 -B5 "PHP Fatal error" /var/log/nginx/error.log
-A5 显示匹配行之后的 5 行,-B5 显示之前的 5 行。这样你看到的就不只是那一句错误,还有它发生前后的环境,往往原因就藏在前面几行里。
反常识点:很多人用 grep -v 排除无用信息,比如排除 health check 这种干扰项,能更快找到真正的问题。
tail —— 盯住实时动态
有时候问题正在发生,你想看日志实时刷新,像看监控摄像头一样:
bash
tail -f /var/log/nginx/access.log
-f 会一直跟着文件末尾,有新内容马上显示。按下 Ctrl+C 退出。
想看最后 100 行? tail -100 /var/log/nginx/error.log
less —— 优雅地翻看大文件
日志文件可能几百 MB,用 cat 会刷屏,用 vim 可能卡死。less 是专门为这种情况生的:
bash
less /var/log/messages
进入之后:
- 上下箭头翻行,空格翻页
/error搜索“error”,按n跳到下一个G跳到文件末尾,g回到开头- 看完按
q退出
less 不会把整个文件读进内存,所以再大也不怕。
journalctl:新时代的瑞士军刀
现在很多 Linux 发行版用 systemd 管理服务,日志也不再是单纯的文本文件,而是被 systemd-journald 收走了。这时候要用 journalctl。
- 查看所有日志:
journalctl - 只看某个服务的日志:
journalctl -u nginx - 只看最近 10 分钟的:
journalctl --since "10 minutes ago" - 只看错误级别及以上的:
journalctl -p err - 实时跟踪:
journalctl -f
最方便的是组合:想看今天早上 8 点到 9 点之间,MySQL 服务的错误日志:
bash
journalctl -u mysql --since "08:00" --until "09:00" -p err
一行命令,精确过滤,比在文本文件里翻半天快多了。
实战案例:502 到底是谁的锅?
前两周一个朋友的网站报 502 Bad Gateway,他急得团团转。我让他一步步查日志。
第一步,看 Nginx 错误日志:
bash
tail -20 /var/log/nginx/error.log
看到一堆 connect() failed (111: Connection refused) while connecting to upstream。意思是 Nginx 想连后端的 PHP 服务,但人家拒绝连接。
第二步,看 PHP-FPM 日志:
bash
tail -20 /var/log/php-fpm/error.log
发现 WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)。哦,PHP-FPM 进程不够用了,新请求来了没空处理。
第三步,调整 PHP-FPM 进程池配置,改大 pm.max_children,重启,问题解决。
整个过程不到十分钟,全靠日志指路。如果没看日志,可能还在重启 Nginx、重启服务器、甚至重装系统,都解决不了问题。
几个小技巧,让日志更好用
1. 用 logrotate 自动切分日志
日志如果不清理,迟早会把磁盘撑爆。Linux 自带的 logrotate 可以按天切分、压缩、删除旧的。配置一般在 /etc/logrotate.d/,看一眼就懂。
2. 实时分析 Web 日志可以用 GoAccess
装个 GoAccess,一行命令就能在终端里看到实时的访问统计:哪个 IP 最多、哪个页面最热、响应时间分布。地址:https://goaccess.io
3. 懒人终端日志查看器:lnavlnav 是个神器,它会自动识别日志格式,高亮显示,还能按时间线合并多个日志。安装后直接 lnav /var/log/nginx/,体验比 less 再上一个台阶。地址:http://lnav.org
日志是服务器的日记本
服务器不会说话,但它每天写日记。遇到问题的时候,它早就把原因记下来了,只等你去翻。
别怕日志多,也别嫌英文烦。常用的就那么几个命令,翻几次就熟了。下次服务器再闹脾气,别急着重启,先看看它写了什么。
说不定它只是在告诉你:磁盘快满了,内存不够了,或者某个进程又卡住了。你看到了,解决了,它就又乖了。
日志这东西,你看得越多,就越觉得服务器像个老朋友——它会把所有的委屈都写下来,只等你来安慰。




