Регистрирует весь массив с помощью монолога [закрыто]
Есть ли способ зарегистрировать весь массив с помощью Monolog? Я читал несколько документов, но не нашел способа зарегистрировать весь массив в удобочитаемом формате, какие-нибудь советы?
Документы, которые я прочитал:
1 answers
Если вы проверите интерфейс регистратора (https://github.com/php-fig/log/blob/master/Psr/Log/LoggerInterface.php ) вы увидите, что все методы ведения журнала получают сообщение в виде строки, поэтому при попытке войти в систему с типом переменной, отличным от string, вы получите предупреждение.
Я попытался использовать процессор для форматирования массива пользовательским способом, но, как и ожидалось, процессор запускается после отправки переменной в интерфейс регистратора.
Самый грязный способ регистрации массива может быть любой из них на ваш выбор;
$logger->info(json_encode($array));
$logger->info(print_r($array, true));
$logger->info(var_export($array, true));
С другой стороны, вы можете захотеть отформатировать свой массив в одном процессоре, чтобы централизовать логику форматирования с помощью принципов DRY.
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');
}
}
Теперь вы можете форматируйте и регистрируйте свой массив по вашему желанию в центральном процессоре запросов без сортировки/форматирования/перемещения по массиву в каждом контроллере.