温馨提示×

Ubuntu下PHP日志配置技巧

小樊
46
2025-11-18 05:28:49
栏目: 编程语言

Ubuntu下PHP日志配置技巧

一 核心配置与路径定位

  • 使用命令定位配置文件:php --ini,常见路径为:/etc/php/{version}/{sapi}/php.ini(如 /etc/php/8.1/apache2/php.ini/etc/php/8.1/fpm/php.ini/etc/php/8.1/cli/php.ini)。修改前先备份:sudo cp php.ini php.ini.bak
  • 常用 php.ini 关键项(生产建议):
    • error_reporting = E_ALL(记录所有错误)
    • display_errors = Off(不在浏览器暴露错误)
    • log_errors = On(开启错误日志)
    • error_log = /var/log/php_errors.log(自定义错误日志路径)
  • 生效方式:
    • Apachesudo systemctl restart apache2
    • Nginx + PHP-FPMsudo systemctl restart php{version}-fpmsudo systemctl restart nginx
  • 注意区分 CLI 与 FPM/Apache 的配置,二者可能分别使用不同的 php.ini。

二 日志轮转与权限安全

  • 使用 logrotate 管理 PHP 错误日志,新建:/etc/logrotate.d/php
  • 示例配置(按天轮转、保留 7 天、压缩、自动创建并设置权限):
/var/log/php_errors.log {
    daily
    missingok
    rotate 7
    compress
    notifempty
    create 640 root adm
}
  • 要点:确保日志目录与文件可被 PHP 进程写入(属主/属组与权限合理),避免日志因磁盘占满导致服务异常。

三 访问日志与FPM慢日志

  • Web 访问日志(用于记录请求,与 PHP 错误日志互补):
    • Apache:在虚拟主机或主配置中使用
      • CustomLog ${APACHE_LOG_DIR}/access.log combined
    • Nginx:在 server 配置中使用
      • access_log /var/log/nginx/access.log;
  • PHP-FPM 慢日志(定位性能瓶颈):在 /etc/php/{version}/fpm/pool.d/www.conf 中启用
    • slowlog = /var/log/php-fpm/www-slow.log
    • request_slowlog_timeout = 5s(示例:超过 5 秒 的请求记录堆栈)
  • 修改 FPM 后重启:sudo systemctl restart php{version}-fpm

四 实时查看与常用分析命令

  • 实时查看:
    • Apache:sudo tail -f /var/log/apache2/error.log
    • Nginx:sudo tail -f /var/log/nginx/error.log
    • PHP-FPM:sudo tail -f /var/log/php-fpm.log/var/log/php{version}-fpm.log
  • 快速分析:
    • 统计错误级别出现次数:grep -E ‘error|warning|notice’ /var/log/php_errors.log | wc -l
    • 查找特定错误:grep ‘SQLSTATE[42S22]’ /var/log/php_errors.log
    • Nginx 访问量前 10 的 IP:
      • cat /var/log/nginx/access.log | awk ‘{print $1}’ | sort | uniq -c | sort -nr | head -10
  • 提示:不同系统与配置下日志路径可能略有差异,必要时检查 Web 服务器与 PHP-FPM 的配置文件。

五 应用层日志与最佳实践

  • 使用 Monolog 记录业务日志(便于分级、轮转与多目标输出):
    • 安装:composer require monolog/monolog
    • 示例(按文件大小保留 7 个历史文件):
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;

$log = new Logger('app');
$log->pushHandler(new RotatingFileHandler('/var/log/my_app.log', 7));
$log->error('Something went wrong', ['context' => 'value']);
  • 最佳实践清单:
    • 生产环境务必 display_errors = Off,仅用 log_errors = On 写入日志;
    • PHP 错误日志与 FPM 日志配置 logrotate
    • FPM 启用 slowlog 与合理的 request_slowlog_timeout
    • 使用 Monolog 等库做业务日志分级与结构化输出;
    • 定期审计日志目录权限与磁盘使用,避免日志膨胀影响服务。

0