PHP-FPM 不支持按路径直接过滤访问日志,但可通过配置 access.log 与 access.format 结构化输出路径信息,再结合 grep、logrotate 或 Nginx 前置分流实现路径级筛选与归档。

PHP-FPM 本身不直接支持按“路径”过滤记录访问日志,它的 access.log 是全量记录(每请求一行),但可通过配置 + 外部工具实现路径级筛选与归档。
启用并指定 PHP-FPM 访问日志位置
访问日志由 pool 级别控制,必须在 /etc/php/8.2/fpm/pool.d/www.conf(或其他 pool 文件)的 [www] 段中配置:
-
access.log = /var/log/php-fpm/www-access.log—— 设置日志文件路径(父目录需存在且权限正确) -
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"—— 可选:自定义格式,%r包含请求路径(如GET /api/v1/users)
通过 format 字段间接“过滤”关键路径
PHP-FPM 不提供条件写入(如只记 /admin/*),但可借助 access.format 把路径、IP、状态码等关键字段结构化输出,方便后续用 grep 或日志系统提取:
- 默认格式已包含
%r(请求行),例如:GET /wp-cron.php HTTP/1.1 - 若需更清晰分离路径,可用:
access.format = "%t %R \"%m %r\" %s %f %{mili}d" - 记录后执行:
grep '"/admin/"' /var/log/php-fpm/www-access.log快速定位后台请求
结合 logrotate 实现路径相关日志归档
对高频路径(如 /health、/cron)做长期分析时,建议用 logrotate 分离归档:
立即学习“PHP免费学习笔记(深入)”;
- 新建
/etc/logrotate.d/php-fpm-admin:
/var/log/php-fpm/www-access.log {
daily
missingok
rotate 30
compress
notifempty
create 0640 www-data www-data
postrotate
# 示例:把含 /admin/ 的行单独抽到归档文件
grep '"/admin/"' /var/log/php-fpm/www-access.log >> /var/log/php-fpm/admin-requests.log 2>/dev/null
endscript
}- 这样既保留原始日志,又生成路径聚焦的辅助日志,不影响主服务性能
更灵活的替代方案:Nginx 层前置过滤
若目标是仅记录特定路径的 PHP 执行行为,推荐在 Nginx 配置中分流:
- 为关键路径单独配 location,并添加自定义日志格式:
log_format php_admin '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time';
<p>server {
location ^~ /admin/ {
access_log /var/log/nginx/admin-php-access.log php_admin;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
}- 该方式由 Nginx 完成路径匹配与日志写入,更轻量、更可控,也避免 PHP-FPM 进程层干扰



















