Как записать многострочные записи с монологом, как отформатированный массив?
Я пытаюсь войти в массив с monolog
в symfony
.
$logger = $this->get('logger');
$logger->info(=print_R($user,true));
вывод, который я получаю, не отформатирован, так как ожидается print_r. Он записывает все это в одну строку.
У меня нет никаких настроек config.yml
в моем config.yml
и подозреваю, что это может быть проблема.
Как я могу print_r(array)
используя монолог, чтобы он отображал отформатированный в tail -f
?
Ответы
Ответ 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
Вам нужно будет использовать 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
)