我正在使用Nginx,MySQL在php-fpm, docker-composed 上运行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!
}
}
乔布斯中的失败示例
class SendMailJob implements ShouldQueue
{
public function handle()
{
\Log::channel('stderr')->info('LOGGING TEST FROM JOB'); // This doesn't work X(
}
}
Supervisor 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会反映到Docker日志中。...正确吗?)
我尝试过的事情
检查了官方文档的说明-在Controller上添加了\Log::channel('stderr')->info('TEST');
并访问了相应的路由,成功了。
在Job文件中尝试了相同的方法,但未成功。
在Job类中添加exec('>&2 echo "TEST"');
:也不起作用
停止了Supervisor,并在将当前用户从php artisan queue:work
更改为root
后手动运行www-data
,这是我通过浏览器加载页面时正在运行的用户程序:实际上已退出登录命令行,但从docker-compose logs
命令中看不到。
*默认情况下,通过Supervisor进行的处理是由用户root
运行的,因此我在conf文件中将其更改为www-data
。但是,就像用户root
一样,这不能解决问题。
我认为使用Supervisor可能是原因...但实际上并没有明确的想法。
当我在主机上运行docker-compose logs
命令时,如果能从Laravel应用程序中看到所有日志,那将是很棒的。
当前,该命令仅显示Controller文件(即通过浏览器访问运行的程序)中的日志。
有人可以帮助我吗? 任何建议将不胜感激。
谢谢!
答案 0 :(得分:0)
问题已解决。 这就是我所做的。
[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
在Dockerfile上设置CMD ['/usr/bin/supervisord']
并运行docker-compose up -d
。
尝试了作业分配,然后在主机上docker-compose logs
。
这向我显示了来自php-fpm或超级用户的所有日志。
正如我所评论的那样,将php-fpm和超级用户放到同一容器中可能根本上是不受欢迎的策略。