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

Heroku not showing log messages created during scheduled tasks

我正在使用 Heroku 托管 Lumen 应用程序。我已经设置了日志记录以将消息发送到标准输出:

// 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 命令中有许多日志消息,其中 none 正在显示。

我认为这可能是因为 > '/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/
当您不调用 ->sendOutputTo() 时,

Laravel 使用 > '/dev/null'。我想不出使用 ->sendOutputTo() 函数发送到标准输出的合适方法。

我为解决此问题所做的工作是将 ->command() 函数更改为 ->call(function(){}) 函数,并执行终端命令可能调用的同一行代码。当 laravel 调用闭包时,它 而不是 将输出转储到 > '/dev/null'

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

幸运的是有一个简单的解决方法:记录到一个文件,并将其内容输出到stdout。然后,Heroku 将能够记录所有内容,无论是使用其本机日志记录还是使用 add-on(如 LogDNA、Papertrail 等)

鉴于您要登录到 logging.php 中的 single 频道,进入文件 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 调度程序

使用这种方法的好处是你不需要改变你的代码,而是配置和环境,所以如果你是运行其他平台上的应用程序 - 它不会改变它们 work/log.

的方式