Docker环境下Symfony Monolog无法写入stderr/stdout且Nginx日志为空求助
解决思路
以下是针对Symfony 6.2 + Monolog + Nginx日志为空问题的排查方向:
1. 验证Monolog是否真的输出日志到php://stderr
你的Monolog配置中,main handler使用了fingers_crossed类型,只有当日志级别达到error及以上时,才会将缓冲的日志(包括debug级别)输出到nested handler。如果仅产生debug级日志,默认不会触发输出:
- 手动触发一条error级日志测试:在代码中添加
$this->logger->error('Test error log'); - 检查PHP-FPM的错误日志(默认路径如
/var/log/php8.1-fpm.log,根据你的PHP版本调整),看是否存在这条日志。如果有,说明Monolog配置无问题,问题出在Nginx与PHP-FPM的日志衔接;如果没有,再检查Monolog的channel和handler配置是否覆盖正确。
2. 配置PHP-FPM转发stderr到Nginx
在FPM环境下,php://stderr默认指向PHP-FPM自身的错误日志,不会直接写入Nginx日志。需要调整PHP-FPM配置实现转发:
- 编辑PHP-FPM的池配置文件(如
/etc/php/8.1/fpm/pool.d/www.conf):catch_workers_output = yes php_admin_value[error_log] = /dev/stderr php_admin_flag[log_errors] = on - 重启PHP-FPM服务:
sudo systemctl restart php8.1-fpm
3. 检查Nginx日志的权限与配置正确性
- 确认Nginx日志文件的路径与权限:默认路径为
/var/log/nginx/error.log和/var/log/nginx/access.log,确保Nginx进程(通常是nginx用户)拥有写入权限:ls -l /var/log/nginx/ - 验证Nginx的server块配置是否正确处理PHP请求,确保包含必要的FastCGI参数:
server { # 其他配置... location ~ \.php$ { root /var/www/html; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_intercept_errors on; } } - 重启Nginx服务:
sudo systemctl restart nginx
4. 临时排除fingers_crossed的影响
如果测试时不想依赖error级日志触发输出,可以临时修改main handler为stream类型,直接输出所有debug级日志:
# config/packages/monolog.yaml monolog: handlers: main: type: stream path: php://stderr level: debug formatter: monolog.formatter.json # 保留其他handler配置...
修改后清理缓存(php bin/console cache:clear),再触发debug日志,检查Nginx error.log是否有内容。
5. 测试原生PHP日志输出
在项目的public/index.php中添加原生PHP日志输出,验证基础日志链路是否正常:
error_log('Native PHP test log', 0);
如果这条日志能出现在Nginx error.log中,说明问题仅存在于Monolog配置;如果没有,继续排查PHP-FPM与Nginx的日志衔接。
内容的提问来源于stack exchange,提问作者Tommy Hoang
相关产品推荐
相关产品推荐

