使用 Laravel 5.6 和 php-fpm 记录到标准输出/标准错误
log to stdout / stderr with Laravel 5.6 and php-fpm
我希望我的 laravel 应用程序能够 运行 以及礼貌的 12 因素应用程序。现在我正在努力让他们在 php-fpm 下从 stdout
(stderr
对我来说也很好)进行日志记录。 php版本为7.2.1,laravel版本为5.6.3。
我配置 laravel 使用 single
驱动程序写入标准输出:
<?php
return [
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
],
'single' => [
'driver' => 'single',
'path' => 'php://stdout',
'tap' => [App\Logging\UseJsonFormatter::class],
'level' => 'debug',
],
];
这在测试服务器上运行良好,但 fpm 会在其前面加上日期和警告:[19-Feb-2018 09:43:41] WARNING: [pool www] child 12 said into stdout:
每 ~1000 个字符。
这个问题似乎被称为 issue 71880 (prefix) and issue 69031 (truncation). A Pull Request saw last action in June / November last year.有没有人有不分块或 t运行 分类日志消息的解决方法(我正在记录 json 对象,我喜欢它们完整)?
Why PHP-FPM prefixes a warning when writing to stdout?与此有关,但也没有解决。
这是UseJsonFormatter.php如果有人感兴趣的话:
<?php
namespace App\Logging;
use Monolog\Formatter\JsonFormatter;
class UseJsonFormatter
{
/**
* Customize the given Monolog instance.
*
* @param \Monolog\Logger $monolog
* @return void
*/
public function __invoke($monolog)
{
$jsonFormatter = new JsonFormatter();
foreach ($monolog->getHandlers() as $handler) {
$handler->setFormatter($jsonFormatter);
}
}
}
这已在 PHP 7.3 中修复。
池的配置指令是 decorate_workers_output = no
,如 pull request 中所述。
对于一般的 Monolog,如果您想在 STDOUT[= 中保留 DEBUG 到 INFO 消息17=] 和更高级别到 STDERR,你可以这样做。
$log->pushHandler(
new \Monolog\Handler\FilterHandler(
new \Monolog\Handler\StreamHandler('php://stdout'),
\Monolog\Logger::DEBUG,
\Monolog\Logger::NOTICE
)
);
$log->pushHandler(
new \Monolog\Handler\FilterHandler(
new \Monolog\Handler\StreamHandler('php://stderr'),
\Monolog\Logger::WARNING,
\Monolog\Logger::EMERGENCY
)
);
我希望我的 laravel 应用程序能够 运行 以及礼貌的 12 因素应用程序。现在我正在努力让他们在 php-fpm 下从 stdout
(stderr
对我来说也很好)进行日志记录。 php版本为7.2.1,laravel版本为5.6.3。
我配置 laravel 使用 single
驱动程序写入标准输出:
<?php
return [
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
],
'single' => [
'driver' => 'single',
'path' => 'php://stdout',
'tap' => [App\Logging\UseJsonFormatter::class],
'level' => 'debug',
],
];
这在测试服务器上运行良好,但 fpm 会在其前面加上日期和警告:[19-Feb-2018 09:43:41] WARNING: [pool www] child 12 said into stdout:
每 ~1000 个字符。
这个问题似乎被称为 issue 71880 (prefix) and issue 69031 (truncation). A Pull Request saw last action in June / November last year.有没有人有不分块或 t运行 分类日志消息的解决方法(我正在记录 json 对象,我喜欢它们完整)?
Why PHP-FPM prefixes a warning when writing to stdout?与此有关,但也没有解决。
这是UseJsonFormatter.php如果有人感兴趣的话:
<?php
namespace App\Logging;
use Monolog\Formatter\JsonFormatter;
class UseJsonFormatter
{
/**
* Customize the given Monolog instance.
*
* @param \Monolog\Logger $monolog
* @return void
*/
public function __invoke($monolog)
{
$jsonFormatter = new JsonFormatter();
foreach ($monolog->getHandlers() as $handler) {
$handler->setFormatter($jsonFormatter);
}
}
}
这已在 PHP 7.3 中修复。
池的配置指令是 decorate_workers_output = no
,如 pull request 中所述。
对于一般的 Monolog,如果您想在 STDOUT[= 中保留 DEBUG 到 INFO 消息17=] 和更高级别到 STDERR,你可以这样做。
$log->pushHandler(
new \Monolog\Handler\FilterHandler(
new \Monolog\Handler\StreamHandler('php://stdout'),
\Monolog\Logger::DEBUG,
\Monolog\Logger::NOTICE
)
);
$log->pushHandler(
new \Monolog\Handler\FilterHandler(
new \Monolog\Handler\StreamHandler('php://stderr'),
\Monolog\Logger::WARNING,
\Monolog\Logger::EMERGENCY
)
);