温馨提示×

Ubuntu PHP日志分割技巧

小樊
50
2025-10-05 08:41:40
栏目: 编程语言

使用Logrotate工具分割PHP日志(Ubuntu系统推荐方法)
Logrotate是Ubuntu系统自带的日志管理工具,可自动分割、压缩、删除旧日志,有效防止PHP日志文件过大占用磁盘空间。以下是具体配置步骤:

1. 安装Logrotate(若未安装)

大多数Ubuntu版本已预装Logrotate,若未安装,可通过以下命令安装:

sudo apt-get update
sudo apt-get install logrotate

2. 创建PHP日志分割配置文件

/etc/logrotate.d/目录下创建专门的PHP配置文件(如php-fpmphp),用于定义日志分割规则:

sudo nano /etc/logrotate.d/php-fpm

3. 配置日志分割参数

在配置文件中添加以下内容(根据实际路径调整,如/var/log/php-fpm/*.log/var/log/php_errors.log):

/var/log/php-fpm/*.log {
    daily                # 每天分割一次(可选:weekly/monthly)
    missingok            # 若日志文件不存在,不报错
    rotate 7             # 保留最近7天的日志
    compress             # 压缩旧日志(节省空间)
    notifempty           # 若日志为空,不进行分割
    create 0640 www-data adm  # 创建新日志文件,权限640,属主www-data(Apache/Nginx用户),属组adm
    sharedscripts        # 所有日志处理完成后统一执行postrotate脚本
    postrotate           # 分割后执行的命令(通知PHP-FPM重新打开日志文件)
        if [ -f /var/run/php-fpm/php-fpm.pid ]; then
            sudo kill -USR2 `cat /var/run/php-fpm/php-fpm.pid`
        fi
    endscript
}

参数说明

  • daily:分割频率,可根据需求改为weekly(每周)或monthly(每月);
  • rotate 7:保留最近7天的日志,超过的自动删除;
  • compress:使用gzip压缩旧日志(如php_errors.log.1.gz);
  • postrotate:分割后必须执行的操作,用于通知PHP-FPM进程重新打开日志文件(避免日志写入旧文件)。

4. 测试Logrotate配置

手动触发配置测试,检查是否有语法错误:

sudo logrotate -f /etc/logrotate.d/php-fpm

若无错误输出,说明配置生效。

5. 自动执行Logrotate

Logrotate默认通过cron每日自动运行(路径:/etc/cron.daily/logrotate),无需额外配置。

补充:针对PHP-FPM的额外配置

若使用PHP-FPM,需确保其日志路径正确(通常在/etc/php/{version}/fpm/php-fpm.conf/etc/php/{version}/fpm/pool.d/www.conf中设置):

; 启用错误日志
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/error.log

; 启用访问日志(可选)
access.log = /var/log/php-fpm/access.log
access.format = "%R - %u %t \"%m %r\" %s %b"

修改后需重启PHP-FPM服务:

sudo systemctl restart php-fpm

可选:使用Monolog库实现代码级日志分割

若需更灵活的日志管理(如按大小分割、分级存储),可使用Monolog库(PHP常用日志库):

  1. 通过Composer安装Monolog:
    composer require monolog/monolog
    
  2. 在PHP代码中配置RotatingFileHandler(按大小分割,保留7个文件):
    use Monolog\Logger;
    use Monolog\Handler\RotatingFileHandler;
    
    $log = new Logger('my_app');
    $log->pushHandler(new RotatingFileHandler('/var/log/my_app.log', 7)); // 保留7个日志文件
    $log->error('This is an error message.');
    

此方法适合需要精细化日志管理的应用场景。

0