Laravel x Docker:如何从排队作业中获取标准日志?
我在php fpm上运行Laravel,docker由Nginx和MySQL组成。 我希望从主机上的Laravel x Docker:如何从排队作业中获取标准日志?,laravel,docker,logging,queue,stdout,Laravel,Docker,Logging,Queue,Stdout,我在php fpm上运行Laravel,docker由Nginx和MySQL组成。 我希望从主机上的docker compose logs命令中可以看到Laravel job中的所有日志,但仍然不成功 根据官方文件,我可以成功地在控制器中获取标准输出的日志,但在作业方面是不可能的 下面是我的示例代码 控制器中的成功示例 class FormController extends Controller { public function index(Request $request)
docker compose logs
命令中可以看到Laravel job中的所有日志,但仍然不成功
根据官方文件,我可以成功地在控制器中获取标准输出的日志,但在作业方面是不可能的
下面是我的示例代码
控制器中的成功示例
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!
}
}
class SendMailJob implements ShouldQueue
{
public function handle()
{
\Log::channel('stderr')->info('LOGGING TEST FROM JOB'); // This doesn't work X(
}
}
工作不成功的例子
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!
}
}
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
我要补充的是,控制器的示例是通过浏览器(加载页面)运行的,而作业是通过主管进程(php artisan队列:工作…)运行的
(据我所知,容器内的标准输出将反映到Docker日志中……这是正确的吗?)
我尝试过的
\Log::channel('stderr')->info('TEST')控制器上的代码>并访问相应的路由,成功
exec('>&2 echo“TEST”)代码>在作业类中:也不起作用
php artisan queue:work
,将当前用户从root
更改为www data
,这是我通过浏览器加载页面时运行程序的用户:确实在命令行中输出了日志,但在docker compose logs
命令中不可见。
*默认情况下,通过Supervisor的进程是以用户root
运行的,所以我在conf文件中将其更改为www-data
。但是,与userroot
一样,这并没有解决问题docker compose logs
命令时,如果我能看到Laravel应用程序中的所有日志,那就太好了。
当前,该命令仅显示控制器文件中的日志(即通过浏览器访问运行的程序)
有人能帮我吗?
任何建议都将不胜感激
谢谢 问题解决了。
这就是我所做的
CMD['/usr/bin/supervisord']
,然后运行docker compose up-d
正如我所评论的,将php fpm和supervisor放在同一个容器中基本上是不受欢迎的策略。我可以通过在
/etc/supervisor/supervisor.conf
文件中设置nodaemon=true
来解决这个问题。但是,此方法禁用php fpm以输出日志。。。我相信将两个不同的系统——php fpm和supervisor——打包在一个容器中是违反Docker理念的。答案可能是,不要在同一个容器上同时使用supervisor和php fpm。。。