Если проверить интерфейс регистратора (https://github.com/php-fig/log/blob/master/Psr/Log/LoggerInterface.php) вы увидите все методы каротажа получает сообщение как строку, поэтому вы получаете предупреждение при попытке выполнить запись с типом переменной, отличным от строки.
Я попытался использовать процессор для форматирования массива настраиваемым образом, но, как ожидалось, процессор запускается после отправки переменной в интерфейс регистратора.
Самым грязным способом регистрации массива может быть любой из них по вашему выбору;
$logger->info(json_encode($array));
$logger->info(print_r($array, true));
$logger->info(var_export($array, true));
С другой стороны, вы можете захотеть форматировать массив в одном proccessor централизовать логику форматирования с СУХИМИ принципами.
Json encode array -> Send as Json String -> json decode to array -> format -> json encode again
CustomRequestProcessor.php
<?php
namespace Acme\WebBundle;
class CustomRequestProcessor
{
public function __construct()
{
}
public function processRecord(array $record)
{
try {
//parse json as object and cast to array
$array = (array)json_decode($record['message']);
if(!is_null($array)) {
//format your message with your desired logic
ksort($array);
$record['message'] = json_encode($array);
}
} catch(\Exception $e) {
echo $e->getMessage();
}
return $record;
}
}
Регистрация процессор запрос в вашем config.yml или services.yml см узла тегов для регистрации процессора для настраиваемого канала.
services:
monolog.formatter.session_request:
class: Monolog\Formatter\LineFormatter
arguments:
- "[%%datetime%%] %%channel%%.%%level_name%%: %%message%%\n"
monolog.processor.session_request:
class: Acme\WebBundle\CustomRequestProcessor
arguments: []
tags:
- { name: monolog.processor, method: processRecord, channel: testchannel }
И в контроллере зарегистрирует ваш массив как строка JSON,
<?php
namespace Acme\WebBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction()
{
$logger = $this->get('monolog.logger.testchannel');
$array = array(3=>"hello" , 1=>"world", 2=>"sf2");
$logger->info(json_encode($array));
return $this->render('AcmeWebBundle:Default:index.html.twig');
}
}
Теперь вы можете форматировать и войти ваш массив как ваше желание в центральном процессоре запроса без сортировки/форматирования/ходить на массив в каждом контроллере.
Я только что потратил 2 дня, пытаясь понять, как это сделать. Благодарю. Кажется, лучшее решение - НЕ использовать монолог вообще. –
Мне удалось получить mined для работы с $ logger-> info (var_export ($ arrayName, true)); , Хотя json_encode - гений :) – frostshoxx
Вам, ребята, не хватает смысла. Монолог разработан с учетом * структурированных * записей. Первым параметром любого метода логатора Monolog должна быть простая строка сообщения - на самом деле, Monolog явно [делает это как таковой] (https://github.com/Seldaek/monolog/blob/master/src/Monolog/Logger .php # L427). Однако методы logger ** поддерживают ** дополнительный параметр '$ context', который будет печатать * после * сообщения. Итак, попробуйте, например, '$ logger-> info (« Мой массив », $ array);' – alexw