一、配置PHP错误日志记录
要分析PHP日志,首先需确保PHP错误信息被正确记录。主要通过修改php.ini文件实现:
/etc/php/{version}/apache2/php.ini(Apache)或/etc/php/{version}/fpm/php.ini(PHP-FPM),需将{version}替换为当前PHP版本(如7.4、8.1)。php.ini中找到并调整以下参数:
error_reporting = E_ALL:记录所有错误(包括提示、警告、致命错误);display_errors = Off:禁止在网页显示错误(避免敏感信息泄露);log_errors = On:启用错误日志记录;error_log = /var/log/php_errors.log:指定错误日志文件路径(需确保目录有写入权限,通常为www-data用户)。sudo systemctl restart apache2)或PHP-FPM(sudo systemctl restart php{version}-fpm)使配置生效。二、配置PHP-FPM日志(若使用PHP-FPM)
若通过PHP-FPM运行PHP,需单独配置其日志:
/etc/php/{version}/fpm/pool.d/www.conf。error_log行的注释并指定路径(如error_log = /var/log/php-fpm/error.log);取消catch_workers_output = yes的注释,以捕获工作进程的输出(便于调试)。sudo systemctl restart php{version}-fpm)。三、使用命令行工具查看与分析日志
基础日志分析可通过以下命令完成:
sudo tail -f /var/log/php_errors.log(实时显示日志末尾内容,按Ctrl+C退出);grep 'Fatal error' /var/log/php_errors.log(筛选出所有“Fatal error”类型的错误);cat /var/log/php_errors.log(适合小文件,大文件建议用less分页查看)。四、配置日志轮转(避免日志过大)
使用logrotate工具定期切割日志,防止单个文件过大:
/etc/logrotate.d/php文件,添加以下内容(以PHP错误日志为例):/var/log/php_errors.log {
daily # 每天轮转
rotate 7 # 保留7份旧日志
compress # 压缩旧日志(节省空间)
delaycompress # 延迟压缩(避免压缩当天日志)
missingok # 若日志不存在也不报错
notifempty # 若日志为空则不轮转
create 0640 www-data adm # 创建新日志文件并设置权限
sharedscripts # 所有日志处理完再执行脚本
postrotate # 轮转后执行的命令(重启服务以重新打开日志文件)
systemctl restart apache2 > /dev/null
endscript
}
sudo logrotate -d /etc/logrotate.d/php(模拟轮转过程,检查是否有错误);sudo logrotate -f /etc/logrotate.d/php(强制立即轮转)。五、使用日志分析工具(高级分析)
对于大规模或复杂的日志,可使用工具实现可视化、实时分析:
logstash.conf文件,从PHP日志文件读取数据(input { file { path => "/var/log/php_errors.log" start_position => "beginning" } }),通过Grok过滤器解析日志(如匹配时间戳、错误类型),并发送到Elasticsearch(output { elasticsearch { hosts => ["localhost:9200"] } });http://localhost:5601,创建索引模式(匹配Elasticsearch中的日志索引),即可通过可视化 dashboard 查看错误趋势、频率等指标。composer require monolog/monolog),支持多种处理器(如RotatingFileHandler日志轮转、SyslogHandler发送到系统日志、ElasticsearchHandler发送到Elasticsearch)。在PHP代码中初始化并使用:use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
$log = new Logger('php');
$log->pushHandler(new RotatingFileHandler('/var/log/php_monolog.log', 7, Logger::ERROR));
$log->error('This is an error message');