使用Laravel 5.6和php-fpm

时间:2018-02-19 10:11:01

标签: php laravel logging laravel-5.6

我希望我的laravel应用程序能够运行有效的12因素应用程序。现在我在php-fpm下努力让他们来往stdoutstderr对我也很好)。 php版本是7.2.1,laravel版本是5.6.3。

我将laravel配置为使用single驱动程序写入stdout:

<?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)issue 69031 (truncation)。去年6月/ 11月,Pull Request看到了最后一次行动。有没有人有一个没有块或截断日志消息的解决方法(我正在记录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);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

此问题已在PHP 7.3中修复。 如pull request中所述,池的配置指令为decorate_workers_output = no

答案 1 :(得分:0)

通常使用Monolog,例如,如果要将 DEBUG 保留为 STDOUT 中的 INFO 消息,并将更高级别保留为 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)
        );