定位日志文件与确认来源

首先,得搞清楚你的 PHP 环境到底用的是哪种处理方式——是 PHP-FPM 还是 Apache 的 mod_php?不同处理程序,日志文件的存放路径可完全不一样。
下面这张表,基本涵盖了 CentOS 上常见部署场景的日志路径,建议直接收藏。
| 组件/场景 | 日志类型 | 典型路径 | 说明 |
|---|---|---|---|
| PHP-FPM | 错误日志 | /var/log/php-fpm/error.log | 运行时错误、警告 |
| PHP-FPM | 访问日志 | /var/log/php-fpm/access.log | 请求记录(若启用) |
| PHP-FPM | 慢执行日志 | 由 slowlog 配置项指定 | 执行时间超过阈值的脚本 |
| Apache + mod_php | 错误日志 | /var/log/httpd/error_log | PHP 错误通常写入此处 |
| Apache + mod_php | 访问日志 | /var/log/httpd/access_log | HTTP 请求记录 |
| Nginx + PHP-FPM | 错误日志 | /var/log/nginx/error.log | 与上游 PHP-FPM 交互错误 |
| Nginx + PHP-FPM | 访问日志 | /var/log/nginx/access.log | HTTP 请求记录 |
另外,如果是 systemd 管理的服务,直接用 journalctl -u php-fpm 或 journalctl -u httpd 也能捞到日志。以上路径和方式,在 CentOS 常见部署下基本都能对上。
快速筛选命令
找到日志文件之后,怎么快速从海量信息里揪出想看的?下面这几个命令套餐,可以直接用。
- 实时查看新增错误
- PHP-FPM:
tail -f /var/log/php-fpm/error.log | grep -i "error\|fatal\|warning" - Apache:
tail -f /var/log/httpd/error_log | grep -i "php" - Nginx:
tail -f /var/log/nginx/error.log | grep -i "php\|upstream"
- PHP-FPM:
- 按时间窗口截取
- 示例(按日志内时间范围):
awk '/2025-11-29 10:00:00/,/2025-11-29 11:00:00/' /var/log/php-fpm/error.log
- 示例(按日志内时间范围):
- 按关键字与上下文
- 含关键字前后各 5 行:
grep -C 5 "keyword" /var/log/httpd/error_log
- 含关键字前后各 5 行:
- 按 IP、URI、状态码筛选
- 某 IP 的访问:
grep '192.168.1.100' /var/log/nginx/access.log - 某接口(如 /api/login)的 5xx 错误:
grep '/api/login' /var/log/nginx/access.log | awk '$9 >= 500'
- 某 IP 的访问:
- 统计与排序
- Top 10 最频繁 URI:
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 - 错误数按小时统计:
grep -i "error" /var/log/php-fpm/error.log | cut -d' ' -f1-2 | uniq -c
- Top 10 最频繁 URI:
以上命令可以自由组合管道,多条件筛选就是几行的事。
按场景给出可直接使用的筛选命令
实战里遇到具体问题,直接复制下面的命令就好。
- 定位 PHP 致命错误与解析器错误
grep -E "PHP (Fatal|Parse) error" /var/log/php-fpm/error.log -A2 -B2
- 找出执行慢的请求(PHP-FPM 慢日志)
- 如果已开启 slowlog,直接按时间阈值筛,例如阈值 5 秒:
awk '$4 > 5 {print}' /path/to/php-fpm.slow.log
- 如果已开启 slowlog,直接按时间阈值筛,例如阈值 5 秒:
- 追踪某个 URL 的异常(跨访问与错误日志)
grep '/checkout.php' /var/log/nginx/access.log | awk '{print $1,$7,$9}'和grep -i "checkout.php" /var/log/php-fpm/error.log联合排查
- 统计 4xx/5xx 比例
awk '{s[$9]++; total++;} END {for (k in s) printf "%s: %d (%.2f%%)\n", k, s[k], s[k]/total*100}' /var/log/nginx/access.log
- 实时观察某接口的错误并高亮
tail -f /var/log/nginx/access.log | grep --line-buffered '/api/pay' | awk '$9 >= 400 {print "\033[31m" $0 "\033[0m"}'
- 仅输出匹配行的请求时间与方法
grep 'login' /var/log/php-fpm/access.log | awk '{print $1,$2,$3,$6}'
上述命令覆盖了错误、慢请求、访问异常、统计等常见场景,拿去就能用。
确保日志可被筛选到
光会命令不够,得先保证日志确实被写下来了。以下配置一步不能少。
- 在 php.ini 中开启错误记录并写入文件(生产环境务必
display_errors = Off)error_reporting = E_ALLdisplay_errors = Offlog_errors = Onerror_log = /var/log/php-fpm/error.log- 修改后重启服务:
systemctl restart php-fpm
- 在 PHP-FPM 池配置(如 www.conf)中启用慢日志并设置阈值
slowlog = /var/log/php-fpm/www-slow.logrequest_slowlog_timeout = 5s- 修改后重启:
systemctl restart php-fpm
- 确认 Web 服务器(Apache/Nginx)访问日志已开启并写入预期路径,以便从访问侧关联错误与请求。
这几步走完,错误、慢请求、访问记录都会乖乖落地,后续筛选分析才有依据。
日志轮转与长期分析
日志文件会越来越大,不处理的话光是读取就能让你怀疑人生。
- 轮转:用 logrotate 对 PHP-FPM、Apache、Nginx 日志做按日或按大小轮转,防止单文件过大拖慢筛选性能。
- 集中化与可视化:小规模场景用 GoAccess 快速出报表;中大规模建议上 ELK Stack(Elasticsearch + Logstash + Kibana)或 Graylog,检索、告警、仪表盘一步到位。
这些做法能帮你把日志从“临时排查工具”升级为“长期监控资产”,效率提升不是一星半点。