我正在使用Heroku来托管Lumen应用。我已设置日志记录以将消息发送到stdout:
// bootstrap/app.php
$app->configureMonologUsing(function ($monolog) {
/** @var Monolog\Logger $monolog */
$monolog->pushHandler(new \Monolog\Handler\StreamHandler('php://stdout', \Monolog\Logger::DEBUG));
});
我通过向日程安排功能
添加日志消息来测试这项工作protected function schedule(Schedule $schedule)
{
\Log::info('Running cronjobs.');
$schedule
->command('update:daily')
->timezone('America/Los_Angeles')
->everyMinute();
}
Heroku日志显示:
Jan 19 09:42:15 service app/scheduler.4140: [2018-01-19 17:42:14] lumen.INFO: Running cronjobs. [] []
Jan 19 09:42:15 service app/scheduler.4140: Running scheduled command: '/app/.heroku/php/bin/php' artisan update:daily > '/dev/null' 2>&1
但是update:daily
命令中包含许多日志消息,并且没有任何消息显示出来。
我认为这可能是因为> '/dev/null'
所以我尝试将->sendOutputTo('php://stdout')
和->sendOutputTo(base_path('storage/logs/cronjobs.log'))
添加到计划任务中,但都不起作用。
这是我的Procfile:
web: vendor/bin/heroku-php-nginx -C heroku-nginx.conf -l storage/logs/cronjobs.log public/
答案 0 :(得分:0)
当您不致电> '/dev/null'
时,Laravel会使用->sendOutputTo()
。我无法找到使用->sendOutputTo()
函数发送到stdout的合适方法。
我为修复此问题所做的是将->command()
函数更改为->call(function(){})
函数,并执行了终端命令可能调用的相同单行代码。当laravel调用Closure时,不将输出转储到> '/dev/null'
。
答案 1 :(得分:0)
Ethan对> '/dev/null'
的观察是正确的。 Heroku从stdout
和stderr
收集日志时-计划的任务未正确记录。
幸运的是,有一个简单的解决方法:登录到文件,并将其内容输出到stdout
中。然后,Heroku将能够记录所有内容,无论是使用其本机记录还是使用LogDNA,Papertrail等附加组件。
鉴于您要登录single
中的logging.php
频道,并进入文件storage/logs/laravel.log
,请用以下内容替换调度程序命令php artisan schedule:run
:
touch ./storage/logs/laravel.log; tail -f ./storage/logs/laravel.log & php artisan schedule:run
它做什么?
stdout
使用此方法的优点是,您无需更改代码,而无需更改配置和环境,因此,如果您在其他平台上运行该应用程序,它将不会改变他们的工作方式/日志。