PHP在Ubuntu上的日志管理策略主要围绕日志收集、轮转管理、存储优化、实时分析与监控五大核心环节构建,旨在实现日志的高效管理、长期保留与快速问题定位。
PHP日志可通过三种方式收集,覆盖不同场景需求:
error_log()函数将日志写入系统默认日志(如Apache的/var/log/apache2/error.log、Nginx的/var/log/nginx/error.log)或指定文件(如/var/log/php_app.log),适用于简单应用。例如:error_log("Database connection failed", 3, "/var/log/php_db_errors.log");。rsyslog将PHP日志转发至系统日志(如/var/log/php_syslog.log),实现集中管理。需修改/etc/rsyslog.conf添加local0.* /var/log/php_syslog.log,并在PHP中调用openlog("PHP", LOG_PID, LOG_LOCAL0)开启。Monolog库(通过Composer安装)支持多处理器(如文件、数据库、Slack),灵活定义日志格式与存储路径。例如:use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/php_monolog.log', Logger::DEBUG));
$log->info('User logged in');
```。
通过logrotate工具定期分割、压缩旧日志,避免日志文件占用过多磁盘空间。核心配置示例(针对PHP-FPM):
/var/log/php-fpm/*.log {
daily # 每天轮转
missingok # 日志不存在时不报错
rotate 7 # 保留7天日志
compress # 压缩旧日志(如.gz格式)
delaycompress # 延迟压缩(避免当天日志被压缩)
notifempty # 日志为空时不轮转
create 0640 www-data adm # 新日志权限与属主(www-data为PHP-FPM用户)
sharedscripts # 所有日志处理完成后执行脚本
postrotate
kill -USR2 $(cat /var/run/php/php7.4-fpm.pid) # 通知PHP-FPM重新打开日志文件
endscript
}
说明:需根据PHP版本(如php7.4-fpm.pid)调整PID文件路径,配置完成后可通过sudo logrotate -f /etc/logrotate.d/php-fpm手动测试。
/var/log/apache2/error.log(错误日志)、/var/log/apache2/access.log(访问日志);/var/log/nginx/error.log、/var/log/nginx/access.log;/var/log/php-fpm.log(或/var/log/php7.x-fpm.log,x为版本号)。/etc/apache2/sites-available/000-default.conf、PHP-FPM的/etc/php/7.x/fpm/pool.d/www.conf),并确保新路径存在且具备正确权限(如chown www-data:adm /var/log/php_custom.log)。对于生产环境,可通过ELK Stack(Elasticsearch+Logstash+Kibana)或Fluentd+Kafka+Elasticsearch实现日志的实时收集、分析与可视化:
/var/log/php-monolog.log),通过Grok过滤器解析日志格式;通过工具(如Monit、Nagios、Zabbix)监控日志文件的大小、修改时间或内容,设置告警规则(如日志文件超过1GB或出现“ERROR”关键字时发送邮件/短信通知)。例如,使用Monit监控PHP-FPM日志:
check file php-fpm-log with path /var/log/php-fpm.log
if size > 1G then alert
if match "ERROR" then alert
```。