Регистрирует весь массив с помощью монолога [закрыто]


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

Документы, которые я прочитал:

Author: Community, 2015-06-16

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');
    }
}

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

 9
Author: Ugur, 2015-06-16 01:13:05