Docker+Nginx Unit环境下无法获取Laravel日志的问题求助
Laravel在Nginx Unit Docker容器中无日志输出的解决方法
问题场景
基于Laravel的项目部署在集成Nginx Unit的Docker容器并托管于ECS,仅能看到Nginx Unit的启动日志:
2024/03/28 14:41:10 [notice] 55#55 module: php 8.2.16 "/usr/lib/unit/modules/php.unit.so" 2024/03/28 14:41:10 [info] 1#1 controller started 2024/03/28 14:41:10 [notice] 1#1 process 55 exited with code 0 2024/03/28 14:41:10 [info] 57#57 router started 2024/03/28 14:41:10 [info] 57#57 OpenSSL 1.1.1w 11 Sep 2023, 1010117f 2024/03/28 14:41:10 [info] 58#58 "laravel" prototype started 2024/03/28 14:41:10 [info] 59#59 "laravel" application started
无任何Laravel业务日志输出,但使用Sail或artisan serve启动时可正常获取日志:
app-1 | WARN local.ERROR: Application is ready (error log) . app-1 | app-1 | WARN local.INFO: Application is ready (info log) . app-1 | app-1 | WARN local.ERROR: Application is ready (error log) . app-1 | app-1 | WARN local.INFO: Application is ready (info log) . app-1 |
排查与解决步骤
1. 检查日志目录权限
Nginx Unit运行用户(通常为unit或www-data)可能没有Laravelstorage/logs目录的写入权限。
- 进入容器执行权限检查:
ls -l storage/logs - 若权限不足,执行授权:
chown -R unit:unit storage/logs chmod -R 755 storage/logs - 也可在Dockerfile中提前配置权限:
RUN chown -R unit:unit /var/www/html/storage RUN chmod -R 755 /var/www/html/storage
2. 确认日志配置路径正确性
检查.env文件中LOG_PATH是否指向容器内的有效路径(默认storage/logs/laravel.log),可临时添加代码验证路径:
// 在路由或控制器中添加 dd(storage_path('logs/laravel.log'));
3. 配置日志输出到标准流
Nginx Unit会收集容器的标准输出/错误流,将Laravel日志定向到这些流即可在容器日志中查看:
- 修改
config/logging.php,添加stdout通道:'stdout' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDOUT_FORMATTER', \Monolog\Formatter\LineFormatter::class), 'with' => [ 'stream' => 'php://stdout', ], 'level' => env('LOG_LEVEL', 'debug'), ], - 在
.env中设置:LOG_CHANNEL=stdout
4. 确保Nginx Unit传递环境变量
检查Nginx Unit的配置文件(如config.json),确保已传递Laravel关键环境变量:
{ "apps": { "laravel": { "type": "php", "root": "/var/www/html/public", "script": "index.php", "environment": { "APP_ENV": "production", "LOG_CHANNEL": "stdout" } } } }
5. 手动触发日志验证
在路由中添加测试代码,主动触发日志输出:
Route::get('/test-log', function () { Log::info('测试日志:来自Nginx Unit环境'); Log::error('测试错误日志:来自Nginx Unit环境'); return '日志已发送'; });
访问该路由后,检查容器日志或日志文件是否有对应内容。
内容的提问来源于stack exchange,提问作者Mykyta Orlov
相关产品推荐
相关产品推荐

