Как не показывать последнюю скобку в монологическом журнале?
// 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: Начать команду { "username": "Joe", "Age": "28" } []
Почему эта скобка в конце?
Ответы
Ответ 1
Это дополнительные данные. Формат 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);
Ответ 2
Старый вопрос, но выбрасывает еще один простой вариант:
$slackHandler = new \Monolog\Handler\SlackWebhookHandler(...);
$slackHandler->getFormatter()->ignoreEmptyContextAndExtra(true);
Ответ 3
Я знаю, что это старый вопрос, но я столкнулся с ним и хочу поделиться своим решением.
Скобки в конце строк журнала связаны с тем, как 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);
Наслаждайтесь!
Ответ 4
Решение Symfony 4:
Создать регистратор:
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);
}
}
Определите форматер в services.yml
:
log.custom.formatter:
class: App\Formatter
Определите форматировщик в monolog.yml
для необходимой среды:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
channels: ["!event"]
formatter: log.custom.formatter