如何使用格式化数组之类的独白记录多行条目?

Posted

技术标签:

【中文标题】如何使用格式化数组之类的独白记录多行条目?【英文标题】:How to log multiline entries with monolog like a formatted array? 【发布时间】:2015-06-01 11:50:12 【问题描述】:

我正在尝试用monologsymfony 中记录一个数组。

$logger = $this->get('logger');
$logger->info(=print_R($user,true));

我得到的输出没有格式化为预期的 print_r。它将所有内容记录在一行上。

我的config.yml 中没有任何独白设置,我怀疑这可能是问题所在。

如何使用独白记录print_r(array),使其以tail -f 的格式显示?

【问题讨论】:

你看过这里symfony.com/doc/current/reference/configuration/monolog.html 【参考方案1】:

Monolog 默认使用Monolog\Formatter\LineFormatter,不带任何参数。 Formatter 基本上是负责日志中最终输出的对象。看构造函数定义:

public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = false, $ignoreEmptyContextAndExtra = false)

正如您所见,由于第三个参数,LineFormatter 从您的 print_r 输出中创建了一行。您需要使用 LineFormatter 的自定义参数定义新服务。

# app/config/services.yml - for example
services:
    monolog.my_line_formatter: # Your name
        class: Monolog\Formatter\LineFormatter
        arguments: [~, ~, true]

现在找到你的独白定义并使用格式化程序来满足你的需要。

# Example from default config_dev.yml
monolog:
    handlers:
        main:
            type:   stream
            path:   "%kernel.logs_dir%/%kernel.environment%.log"
            level:  debug
            formatter: monolog.my_line_formatter

【讨论】:

谢谢。文档可以很好地添加一些如此清晰和直接的内容。 这是一个很好的答案,但看看这个。您需要跨 2 个单独的配置调用服务,以便将换行符回显到日志文件。正如@Chris 提到的,关于如何做到这一点的零文档。 log4j、log4php、railslogger 等通常支持换行符,我从来不需要编写超过一两个配置行,更不用说调用一个知道什么服务来简单地回显完全可接受的 ascii 换行符的服务。圣牛。 这更多是关于 Monolog 库而不是 Symfony。 Symfony 允许你配置 Monolog,它实际上是作为独立库工作的。如果你知道 Monolog 和 Symfony 服务容器,那么这个解决方案非常清晰,甚至在 doc 中。【参考方案2】:

您将需要使用use Monolog\Formatter\LineFormatter 来覆盖日志消息格式化程序的默认设置。下面是代码:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\LineFormatter;

$logFilePath = __DIR__.'/path/to/logFile.log';
$arr = array('abc' => 'xyz', 'qwerty' => 'yuiop', 'username' => 'abc xyz');

$logger = new Logger('my_logger');

$formatter = new LineFormatter(
    null, // Format of message in log, default [%datetime%] %channel%.%level_name%: %message% %context% %extra%\n
    null, // Datetime format
    true, // allowInlineLineBreaks option, default false
    true  // discard empty Square brackets in the end, default false
);

// Debug level handler
$debugHandler = new StreamHandler($logFilePath, Logger::DEBUG);
$debugHandler->setFormatter($formatter);

$logger->pushHandler($debugHandler);

$logger->info('FORMATTED ARRAY WITH MULTI-LINE');
$logger->info(print_r($arr, true));

以下是写入日志文件的日志消息:

[2019-06-06 09:24:05] my_logger.INFO: FORMATTED ARRAY WITH MULTI-LINE  
[2019-06-06 09:24:05] my_logger.INFO: Array
(
    [abc] => xyz
    [qwerty] => yuiop
    [username] => abc xyz
)

【讨论】:

以上是关于如何使用格式化数组之类的独白记录多行条目?的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何使用独白登录到控制台(php://out)?

Swift:如何避免 CoreData 中的重复条目以使用 JSON 数组实现?

如何将 swiftmailer 处理程序与独白一起使用

Kubernetes中的多行流利日志

如何将Oracle中同一列的多行记录拼接成一个字符串

BootCDNApi使用记录