服务器日志不会看?常用日志分析命令与技巧

服务器日志不会看?常用日志分析命令与技巧

服务器出问题的时候,你第一反应是什么?

大部分人要么重启,要么上网搜错误码,要么直接找运维朋友救命。但其实服务器自己早就把问题写下来了,就藏在某个角落——日志文件里。

日志是服务器的黑匣子。它记下了每一次心跳、每一次喘息、每一次崩溃前的惨叫。问题是你得听得懂它在说什么。

很多人面对日志的第一反应是:太多了,从哪看?全是英文,看不懂。别急,今天咱们就聊聊,怎么从一堆乱麻似的日志里,快速捞出那条真正有用的线索。


日志都藏在哪?

先搞清楚你的服务器把日记本放哪了。不同系统、不同服务,日志位置不太一样,但有几个地方是通用的:

  • 系统日志/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. 懒人终端日志查看器:lnav
lnav 是个神器,它会自动识别日志格式,高亮显示,还能按时间线合并多个日志。安装后直接 lnav /var/log/nginx/,体验比 less 再上一个台阶。地址:http://lnav.org


日志是服务器的日记本

服务器不会说话,但它每天写日记。遇到问题的时候,它早就把原因记下来了,只等你去翻。

别怕日志多,也别嫌英文烦。常用的就那么几个命令,翻几次就熟了。下次服务器再闹脾气,别急着重启,先看看它写了什么。

说不定它只是在告诉你:磁盘快满了,内存不够了,或者某个进程又卡住了。你看到了,解决了,它就又乖了。

日志这东西,你看得越多,就越觉得服务器像个老朋友——它会把所有的委屈都写下来,只等你来安慰。

知识库

服务器运维中最让人抓狂的5个故障

2026-3-12 14:08:09

实操指南

服务器加固指南:增强系统安全的实用措施

2024-11-4 9:20:25

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧