排查问题从看日志开始
服务器半夜报警,网站打不开,接口返回500。这种时候别慌,先去看日志。运维日常里,80%的问题都能从错误日志里找到线索。掌握几个常用命令,能让你快速定位故障点,少背锅。
查看实时日志输出:tail -f
服务刚重启,想看看有没有报错,最直接的方式就是盯着日志实时刷。
tail -f /var/log/nginx/error.log
这条命令会持续输出文件末尾新增的内容,适合观察正在发生的错误。比如你改了Nginx配置,重载后马上用它看一眼,如果有语法错误或端口冲突,立刻就能看到。
搜索关键错误信息:grep
日志文件动辄几百M,肉眼翻不现实。用grep过滤关键词,精准打击。
grep "502 Bad Gateway" /var/log/nginx/error.log
还可以加上行号和上下文:
grep -n -A 2 -B 2 "Connection refused" /var/log/app.log
-n 显示行号,-A 2 输出匹配行之后的2行,-B 2 之前2行,方便看清错误前后的操作流程。
按时间筛选日志:sed 或 awk
有时候你知道问题发生在某个时间段,比如昨晚8点到8点半。可以用sed截取这个区间。
sed -n '/2024-06-15 20:00/,/2024-06-15 20:30/p' /var/log/syslog
前提是日志每行开头有标准时间戳。这种方式比全文件grep快得多。
查看系统级错误:dmesg
程序起不来,可能是系统资源出问题。内存耗尽、进程被杀,这些通常不会写进应用日志,但会出现在内核日志里。
dmesg | grep -i "killed process"
看到oom-killed(内存不足被杀)的记录,基本就能确定是内存爆了,该加就加,该优化就优化。
综合查询工具:journalctl(适用于 systemd 系统)
现在大多数 Linux 发行版都用 systemd,服务日志统一归 journalctl 管。
journalctl -u nginx.service --since "2 hours ago"
查某个服务最近两小时的日志。还能按等级过滤:
journalctl -u mysql.service -p err
只看 MySQL 服务的错误级别日志,省去一堆info干扰。
压缩日志怎么查?zgrep 来帮忙
老日志通常会被 logrotate 压缩归档,变成 .gz 文件。别解压,直接用 zgrep。
zgrep "timeout" /var/log/nginx/error.log.1.gz
它和 grep 用法一样,支持正则和上下文参数,效率高还不占空间。
小技巧:给常用组合写个别名
每天都要查 PHP 错误,可以加个别名到 ~/.bashrc:
alias phperr='grep -i "fatal\|error" /var/log/php-fpm.log | tail -20'
以后输入 phperr 就能快速看到最近的严重问题,省得每次都敲一长串。