2015-06-15 5 views
4

Есть ли способ зарегистрировать весь массив с помощью Monolog? Я читал несколько документов, но не нашел способ зарегистрировать весь массив в читаемом формате, какие-либо советы?Записывает весь массив с помощью Monolog

Docs Я прочитал:

ответ

6

Если проверить интерфейс регистратора (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'); 
    } 
} 

Теперь вы можете форматировать и войти ваш массив как ваше желание в центральном процессоре запроса без сортировки/форматирования/ходить на массив в каждом контроллере.

+1

Я только что потратил 2 дня, пытаясь понять, как это сделать. Благодарю. Кажется, лучшее решение - НЕ использовать монолог вообще. –

+0

Мне удалось получить mined для работы с $ logger-> info (var_export ($ arrayName, true)); , Хотя json_encode - гений :) – frostshoxx

+2

Вам, ребята, не хватает смысла. Монолог разработан с учетом * структурированных * записей. Первым параметром любого метода логатора Monolog должна быть простая строка сообщения - на самом деле, Monolog явно [делает это как таковой] (https://github.com/Seldaek/monolog/blob/master/src/Monolog/Logger .php # L427). Однако методы logger ** поддерживают ** дополнительный параметр '$ context', который будет печатать * после * сообщения. Итак, попробуйте, например, '$ logger-> info (« Мой массив », $ array);' – alexw

 Смежные вопросы

  • Нет связанных вопросов^_^