Linux下PHP日志清理实用技巧
logrotate是Linux系统自带的日志管理工具,可自动完成日志切割、压缩、删除及通知,是PHP日志清理的核心方案。
sudo apt-get install logrotate,CentOS使用sudo yum install logrotate)。/etc/logrotate.d/目录下创建专门配置文件(如php-fpm),内容示例如下:/var/log/php-fpm/*.log { # 匹配PHP-FPM日志路径(根据实际调整)
daily # 每天轮转一次
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 root adm # 创建新日志文件的权限与属主
sharedscripts # 所有日志处理完成后执行脚本
postrotate # 轮转后执行的命令(重启PHP-FPM以重新打开日志文件)
if [ -f /var/run/php-fpm.pid ]; then
kill -USR1 `cat /var/run/php-fpm.pid`
fi
endscript
}
logrotate -d /etc/logrotate.d/php-fpm测试配置是否正确(dry run模式),无误后用logrotate -f /etc/logrotate.d/php-fpm强制立即轮转。若需立即清理,可通过以下命令手动操作(需root权限):
truncate命令(保留文件但清空内容,适合正在写入的日志):sudo truncate -s 0 /var/log/php-fpm/error.log # 替换为实际日志路径
或使用echo命令(直接覆盖为空文件):sudo echo "" > /var/log/php-fpm/error.log
find命令查找并删除指定天数前的日志(如删除30天前的.log文件):sudo find /var/log/php-fpm/ -name "*.log" -mtime +30 -exec rm -f {} \;
过高的日志级别(如E_ALL)会记录大量调试信息,增加日志体积。通过降低日志级别,仅记录关键错误:
error_reporting和log_errors设置,调整为:error_reporting = E_ERROR | E_WARNING # 仅记录错误和警告
log_errors = On # 开启错误日志
error_log = /var/log/php_errors.log # 指定日志路径(可选)
ini_set函数在代码中临时调整:ini_set('error_reporting', E_ERROR | E_WARNING);
ini_set('log_errors', 1);
若PHP应用使用Monolog库(主流PHP框架如Laravel、Symfony默认集成),可通过其内置功能实现日志分割、压缩及远程存储:
config/logging.php),添加RotatingFileHandler(按大小/天数分割)或DailyFileHandler(按天分割):'channels' => [
'php' => [
'driver' => 'single',
'path' => storage_path('logs/php.log'),
'level' => 'error',
'handler' => \Monolog\Handler\RotatingFileHandler::class,
'handler_with' => [
'filename' => storage_path('logs/php-%Y-m-d.log'), // 按天分割
'maxFiles' => 7, // 保留7天
'level' => \Monolog\Logger::ERROR,
],
],
],
通过cron任务定期运行脚本,实现无人值守的日志清理:
/usr/local/bin/clean_php_logs.sh,内容如下:#!/bin/bash
LOG_DIR="/var/log/php-fpm"
find "$LOG_DIR" -name "*.log" -mtime +7 -exec rm -f {} \; # 删除7天前的日志
sudo chmod +x /usr/local/bin/clean_php_logs.sh
sudo crontab -e),添加以下行(每天凌晨2点执行):0 2 * * * /usr/local/bin/clean_php_logs.sh >> /var/log/php_clean.log 2>&1
sudo命令。sudo systemctl restart php-fpm、sudo systemctl restart apache2)使配置生效。