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 从 stdout
和 stderr
收集日志 - 计划任务未正确记录。
幸运的是有一个简单的解决方法:记录到一个文件,并将其内容输出到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
它有什么作用?
- 确保日志文件存在。如果没有-以下命令将失败
- 跟踪日志文件,所以它的内容输出到
stdout
- 正在启动 Laravel 调度程序
使用这种方法的好处是你不需要改变你的代码,而是配置和环境,所以如果你是运行其他平台上的应用程序 - 它不会改变它们 work/log.
的方式
我正在使用 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 从 stdout
和 stderr
收集日志 - 计划任务未正确记录。
幸运的是有一个简单的解决方法:记录到一个文件,并将其内容输出到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
它有什么作用?
- 确保日志文件存在。如果没有-以下命令将失败
- 跟踪日志文件,所以它的内容输出到
stdout
- 正在启动 Laravel 调度程序
使用这种方法的好处是你不需要改变你的代码,而是配置和环境,所以如果你是运行其他平台上的应用程序 - 它不会改变它们 work/log.
的方式