我正在尝试使用symfony中的monolog记录数组。
$logger = $this->get('logger');
$logger->info(=print_R($user,true));
我得到的输出没有格式化为print_r。它将所有内容记录在一行上。
我的config.yml中没有任何独白设置,并怀疑这可能是问题所在。
如何使用monolog记录print_r(数组),以便显示格式为tail -f?
答案 0 :(得分:16)
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]
现在找到你的monolog定义并使用formatter来满足你的需要。
# 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
答案 1 :(得分:0)
您将需要使用https://www.projectsmart.co.uk/forums/viewtopic.php?t=1207
覆盖日志消息格式化程序的默认设置。下面是代码:
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));