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
)使配置生效。