温馨提示×

Ubuntu PHP日志轮转机制是什么

小樊
34
2025-12-13 22:18:10
栏目: 编程语言

Ubuntu PHP日志轮转机制

核心机制

  • 在 Ubuntu 上,PHP 的日志轮转通常由系统自带的 logrotate 统一管理,而不是 PHP 内核自带的功能。PHP-FPM 和业务应用常见日志路径包括 /var/log/php-fpm/*.log 以及 php.ini 中 error_log 指定的文件。logrotate 按日(或按大小)切割日志、压缩归档、删除过期文件,并通过通知机制让进程重新打开日志文件,避免继续写入旧文件句柄。

触发与执行方式

  • 定时触发:系统通过 /etc/cron.daily/logrotate 每日由 cron 调用执行,无需单独启用 logrotate 服务;也可按需手动执行。
  • 手动触发与调试:
    • 语法/模拟运行:sudo logrotate -d /etc/logrotate.conf(检查配置是否正确)
    • 强制执行一次:sudo logrotate -f /etc/logrotate.d/php-fpm(或针对具体配置)

典型配置示例

  • PHP-FPM 日志轮转(/etc/logrotate.d/php-fpm)
/var/log/php-fpm/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/php-fpm/php-fpm.pid ]; then
            kill -USR2 $(cat /var/run/php-fpm/php-fpm.pid 2>/dev/null) || true
        fi
    endscript
}
  • PHP 错误日志轮转(/etc/logrotate.d/php-errors)
/var/log/php_errors.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
}
  • 说明:FPM 使用 USR2 信号通知重新打开日志;若使用 Apache SAPI,也可在 postrotate 中执行 invoke-rc.d apache2 reload 触发重载。

关键参数与动作

  • 常用指令
    • daily/weekly/monthly:按天/周/月轮转
    • rotate N:保留最近 N 个归档
    • compress/delaycompress:压缩归档;delaycompress 常用于让最新一份暂不压缩
    • missingok/notifempty:文件缺失不报错;空文件不轮转
    • create MODE OWNER GROUP:轮转后重建日志文件的权限与属主
    • sharedscripts:同组多个日志仅执行一次 postrotate
    • postrotate/endscript:轮转后执行的命令(如通知进程重开日志)
  • 进程通知动作
    • PHP-FPM:发送 USR2 信号,使 FPM 重新打开日志文件
    • Apache:执行服务 reload,让 PHP 模块重新打开日志句柄

排错与最佳实践

  • 先确认日志路径:检查 php.ini 的 error_log、FPM 的 access/error log 配置,以及应用自身日志目录,确保 logrotate 配置路径与之匹配。
  • 先用模拟再上线:logrotate -d 检查语法与匹配规则,再用 -f 做一次真实轮转验证归档与权限是否正确。
  • 权限与属主:使用 create 0640 www-data adm 等设置,确保 Web 服务对日志有写入权限。
  • 信号与重载:FPM 用 USR2;Apache 用 reload,避免因句柄未切换导致日志继续写入旧文件。
  • 控制日志量:结合业务将 PHP 错误报告级别调至必要范围,避免非关键日志撑大磁盘。

0