【发布时间】:2019-06-18 08:55:29
【问题描述】:
我在 php-fpm、docker-composed 上使用 Nginx、MySQL 运行 Laravel。
我想让 Laravel 作业的所有日志都可以从主机上的 docker-compose logs 命令中看到,但是仍然不成功。
按照官方文档,我可以在Controllers中成功获取STDOUT的日志,但对于Jobs却是不可能的。
这是我的示例代码。
控制器中的成功示例
class FormController extends Controller
{
public function index(Request $request)
{
\Log::channel('stderr')->info('LOGGING TEST FROM CONTROLLER'); // This works perfectly as expected, i.e. visible with `docker-compose logs` command on the Host!
}
}
Jobs 中的不成功示例
class SendMailJob implements ShouldQueue
{
public function handle()
{
\Log::channel('stderr')->info('LOGGING TEST FROM JOB'); // This doesn't work X(
}
}
主管配置文件
[program:form]
command=php /usr/local/laravel/artisan queue:work database --sleep=3 --tries=3
user=www-data
environment=HOME="/home/www-data",USER="www-data"
autostart=true
numprocs=2
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
我要补充一点,Controllers 的示例是通过浏览器运行的(加载页面),而 Jobs 是通过 Supervisor 进程运行的(php artisan queue:work...)。
(而且,据我了解,容器内的 STDOUT 会反映到 Docker 日志中。...这是正确的吗?)
我的尝试
查看官方文档说明-在Controller上添加
\Log::channel('stderr')->info('TEST');并访问对应路由,成功。在 Job 文件中尝试了相同的方法,但不成功。
在 Job 类中添加
exec('>&2 echo "TEST"');:也不起作用在将当前用户从
root更改为www-data后,停止了Supervisor 并手动运行php artisan queue:work,这是我通过浏览器加载页面时运行程序的用户:实际上确实在命令行中输出了日志,但是从docker-compose logs命令不可见。 *默认情况下,通过 Supervisor 的进程以用户root运行,因此我在 conf 文件中将其更改为www-data。但是,与用户root一样,这并没有解决问题。
我假设使用 Supervisor 可能是原因......但实际上并没有明确的想法。
当我在主机上运行docker-compose logs 命令时,如果我能看到来自 Laravel 应用程序的所有日志,那就太好了。
目前,该命令仅显示控制器文件中的日志(即通过浏览器访问运行的程序)。
谁能帮帮我? 任何建议将不胜感激。
谢谢!
【问题讨论】:
-
我可以通过在
/etc/supervisor/supervisord.conf文件中设置nodaemon=true来解决它。但是,这种方法禁用 php-fpm 来输出日志......我相信将两个不同的系统 - php-fpm 和主管 - 打包在一个容器中是违反 Docker 理念的。答案可能是,不要在同一个容器上同时使用 supervisor 和 php-fpm...
标签: laravel docker logging queue stdout