Heroku不显示在计划任务期间创建的日志消息

时间:2018-01-22 18:19:08

标签: php logging heroku lumen

我正在使用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/

2 个答案:

答案 0 :(得分:0)

当您不致电> '/dev/null'时,Laravel会使用->sendOutputTo()。我无法找到使用->sendOutputTo()函数发送到stdout的合适方法。

我为修复此问题所做的是将->command()函数更改为->call(function(){})函数,并执行了终端命令可能调用的相同单行代码。当laravel调用Closure时,将输出转储到> '/dev/null'

答案 1 :(得分:0)

Ethan对> '/dev/null'的观察是正确的。 Heroku从stdoutstderr收集日志时-计划的任务未正确记录。

幸运的是,有一个简单的解决方法:登录到文件,并将其内容输出到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

它做什么?

  1. 确保日志文件存在。如果没有,以下命令将失败
  2. 尾随日志文件,因此其内容输出到stdout
  3. 启动Laravel调度程序

使用此方法的优点是,您无需更改代码,而无需更改配置和环境,因此,如果您在其他平台上运行该应用程序,它将不会改变他们的工作方式/日志。