Один из способов — добавить пользовательские "cspecs" в файл PatternLayout
. Использование API
Log::Log4perl::Layout::PatternLayout::add_global_cspec(
'A', sub { ... }
); # can now use %A
где это должно произойти перед вызовом new
, который затем может использовать спецификатор %A
.
Это можно настроить в конфигурации вместо этого, как показано в связанных документах. Или метод add_global_cspec
можно вызвать для объекта $layout
(но я не смог понять интерфейс.)
Анонимный саб получает
($layout, $message, $category, $priority, $caller_level)
layout: объект PatternLayout, вызвавший его
message: сообщение журнала (%m)
категория: например. бакалея.напитки.взрослое.пиво.шлиц
приоритет: напр. DEBUG|WARN|INFO|ERROR|FATAL
caller_level: сколько уровней резервного копирования стека вызовов вам нужно пройти, чтобы найти вызывающего абонента
что можно использовать для реализации критериев форматирования отпечатков.
Вот простой пример пользовательского указания всего формата
use strict;
use warnings;
use Log::Log4perl qw(get_logger :levels);
my $logger = get_logger();
$logger->level($INFO);
Log::Log4perl::Layout::PatternLayout::add_global_cspec(
'A', sub { return (
$_[1] !~ /^more/ # /^more/ taken to indicate
? "$_[3]: " # the continuation criterion,
: ' ' x length $_[3] . ' ' # or start with 'INFO: '
) . $_[1]
});
my $layout = Log::Log4perl::Layout::PatternLayout->new("%A%n");
my $appender = Log::Log4perl::Appender->new(
"Log::Dispatch::File",
filename => "new_test.log",
mode => "write",
);
$logger->info('some info');
$logger->info('more info');
$logger->info('info');
$logger->info('more and more info');
который печатает
INFO: some info
more info
INFO: info
more and more info
Такой пользовательский спецификатор, конечно, можно комбинировать с предоставленными.
Поскольку список в info(...)
объединяется регистратором в строку, которая передается в приложение (я), мы можем выбрать заголовок в вызывающем объекте с очевидным интерфейсом.
$logger->info('*', "... message ..."); # * for heading (add INFO:)
где первая строка выше — это то, что ищет регулярное выражение в нашем cspec
.
Это форматирует каждую строку журнала на основе ее содержимого. Более универсальный вариант — напишите свой собственный аппендер (FAQ), который представляет собой довольно простой класс, в котором вы можете хранить строки и управлять ими по мере необходимости. См. пример группирование сообщений (FAQ).
Наконец, правильный способ настроить выбор сообщений — добавить категория. Затем вы можете получить новый регистратор и настроить его для отображения INFO:
(для строки заголовка), в то время как остальные сообщения в этой группе отправляются другим регистратором, настроенным так, чтобы он не отображался. См. этот пост для простого примера.
Недостатком является то, что теперь есть гораздо больше работы с регистраторами, приложениями и компоновкой, и все это только для небольшой настройки в этом случае.
Если это не отвечает всем требованиям, пожалуйста, уточните, как вы решаете, какие отпечатки должны быть сгруппированы.
person
zdim
schedule
19.09.2017
INFO
в каждой строке? Мне нужно было бы взглянуть на внутреннюю реализацию, но, возможно, вы можете создать что-то, что обертывает->info
, чтобы вести себя так, как вы хотите, когда вы передаете список. Тогда у вас может быть@logmessages
вместо$logmessage
. - person simbabque   schedule 17.09.2017INFO
илиWARN
или что-то еще, то я игнорирую их, что (для меня) лишает их значения - person cmhughes   schedule 17.09.2017info
? - person zdim   schedule 19.09.2017$logger->info("some information"); $logger->moreinfo("more information");
? - person ikegami   schedule 19.09.2017@ikegami
), чтобы я получил уведомление. - person ikegami   schedule 21.09.2017$logger->info("*...")
для «заголовков» и$logger->info("...")
для «не заголовков» (соответственно я скорректировал анонимную подпрограмму) - person cmhughes   schedule 21.09.2017