Как не показывать последнюю скобку в строке лога монолога?

// in my PHP code
$log = new Logger('LaurentCommand');
$log->pushHandler(new StreamHandler('./app/logs/LaurentCommand.log'));
$log->addInfo("Start command",array('username' => 'Joe', 'Age' => '28'));

Результат в файле журнала LaurentCommand.log:

[2012-12-20 10:28:11] LaurentCommand.INFO: Запустить команду {"имя пользователя":"Джо","Возраст":"28"} []

Почему эта скобка в конце?


person stloc    schedule 20.12.2012    source источник


Ответы (4)


Это дополнительные данные. Формат по умолчанию для LineFormatter: "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n". имя пользователя/возраст — это контекст, а дополнительное, обычно пустое, приводит к этому пустому массиву [].

Если вы используете процессоры для прикрепления данных к записям журнала, они обычно записывают их в дополнительный ключ, чтобы избежать конфликтов с контекстной информацией. Если это действительно проблема для вас, вы можете изменить формат по умолчанию и опустить %extra%.

Изменить: начиная с Monolog 1.11, LineFormatter имеет параметр $ignoreEmptyContextAndExtra в конструкторе, который позволяет вам удалить их, поэтому вы можете использовать это:

// the last "true" here tells it to remove empty []'s
$formatter = new LineFormatter(null, null, false, true);
$handler->setFormatter($formatter);
person Seldaek    schedule 20.12.2012
comment
Селдаек означает $log = new Logger('LaurentCommand'); $handler = new StreamHandler('./app/logs/LaurentCommand.log'); $handler->setFormatter(new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context%\n")); $log->pushHandler($handler); $log->addInfo("Start command",array('username' => 'Joe', 'Age' => '28')); - person nevvermind; 16.10.2014
comment
Работает как шарм. Спасибо :) - person Radu Murzea; 04.08.2015

Старый вопрос, но выбросить еще один простой вариант:

$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...);
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true);
person Chris    schedule 04.02.2017

Я знаю, что это старый вопрос, но я тоже столкнулся с ним и хочу поделиться своим решением.

Скобки в конце строк журнала связаны с тем, как Monolog LineFormatter пытается json_encode() данные в %extra%. Скобки представляют собой JSON-представление пустого массива.

Чтобы отключить эти скобки, мне пришлось создать подкласс Monolog\Formatter\LineFormatter с моим собственным классом и перезаписать его функцию convertToString($data), чтобы она возвращала пустую строку, если данных нет. Вот мой новый подкласс:

namespace My\Fancy\Monolog;
use Monolog\Formatter\LineFormatter;

class LineFormatter extends LineFormatter {

    protected function convertToString($data)
    {
        if (null === $data || is_scalar($data)) {
            return (string) $data;
        }

        // BEGIN CUSTOM CODE - This section added to prevent empty 
        // brackets from appearing at the end of log lines:
        if ((is_array($data) && !$data) 
            || is_object($data) && !get_object_vars($data)) {
            return '';
        }
        // END CUSTOM CODE 

        $data = $this->normalize($data);
        if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
            return $this->toJson($data);
        }

        return str_replace('\\/', '/', json_encode($data));
    }
}

Вы можете использовать этот класс, внедрив его экземпляр в свой класс-обработчик Monolog, например:

$handler = new Monolog\Handler\StreamHandler('/path/to/my/logfile', 'debug');
$handler->setFormatter(new My\Fancy\Monolog\LineFormatter());
$monolog->pushHandler($handler);

Наслаждаться!

person curtisdf    schedule 12.11.2013

Решение Symfony 4:

  1. Создать регистратор:

    use Monolog\Formatter\LineFormatter;
    
    class Formatter extends LineFormatter
    {
        public function __construct(
            $format = null,
            $dateFormat = null,
            $allowInlineLineBreaks = false,
            $ignoreEmptyContextAndExtra = false
        ) {
            parent::__construct($format, $dateFormat, $allowInlineLineBreaks, true);
        }
    }
    
  2. Определить средство форматирования в services.yml:

    log.custom.formatter:
      class: App\Formatter
    
  3. Определите средство форматирования в monolog.yml для необходимых сред:

    handlers:
      main:
        type: stream
        path: "%kernel.logs_dir%/%kernel.environment%.log"
        level: debug
        channels: ["!event"]
        formatter: log.custom.formatter
    
person Alexander Yancharuk    schedule 03.09.2019