使用 Laravel 5.6 和 php-fpm 记录到标准输出/标准错误

log to stdout / stderr with Laravel 5.6 and php-fpm

我希望我的 laravel 应用程序能够 运行 以及礼貌的 12 因素应用程序。现在我正在努力让他们在 php-fpm 下从 stdoutstderr 对我来说也很好)进行日志记录。 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[= 中保留 DEBUGINFO 消息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
    )
);