我在php-fpm上运行Laravel,docker由Nginx,MySQL组成。
我想让Laravel作业的所有日志在主机上的docker-compose logs
命令中可见,但是仍然失败。
按照官方文档,我可以成功在Controllers中的STDOUT上获取日志,但是就Jobs而言却是不可能的。
这是我的示例代码。
Controller 中的成功示例
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(
}
}
主管conf文件
[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会反射(reflect)到Docker日志中。...正确吗?)
我尝试过的
\Log::channel('stderr')->info('TEST');
并访问了相应的路由,成功了。 exec('>&2 echo "TEST"');
:也不起作用php artisan queue:work
更改为root
后停止了Supervisor,并手动运行了www-data
,这是我通过浏览器加载页面时正在运行的用户程序:确实在命令行中放置了日志,但是从docker-compose logs
命令中看不到日志。*默认情况下,通过Supervisor进行的处理是使用用户
root
运行的,因此我在conf文件中将其更改为www-data
。但是,就像用户root
一样,这不能解决问题。 我假设使用Supervisor可能是原因……但实际上并没有明确的想法。
当我在主机上运行
docker-compose logs
命令时,如果我能从Laravel应用程序中看到每个日志,那将是很棒的。当前,该命令仅显示Controller文件中的日志(即通过浏览器访问运行的程序)。
谁能帮我?
任何建议将不胜感激。
谢谢!
最佳答案
问题解决了。
这就是我所做的。
[program:php-fpm]
process_name=%(program_name)s_%(process_num)02d
command=php-fpm
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
[program:form]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/local/laravel/artisan queue:work database --sleep=3 --tries=3
autostart=true
autorestart=true
numprocs=2
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
CMD ['/usr/bin/supervisord']
并运行docker-compose up -d
。 docker-compose logs
。这向我显示了来自php-fpm或 super 用户的每个日志。
正如我已经评论过的,虽然将php-fpm和 super 用户放到同一容器中,这可能是根本不受欢迎的策略。
关于laravel - Laravel x Docker:如何从排队的作业中获取STDOUT日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56645285/