Как заставить %x в Log4perl не показывать [undef]?

Когда я ничего не помещал в стек Log::Log4perl::NDC, %x возвращает [undef]. Я хотел бы, чтобы он возвращал пустую строку, когда стек пуст.

Например, возьмите этот код:

use strict;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init({ level => $INFO, layout => "%x %m%n" });
Log::Log4perl->get_logger()->info("first message");
Log::Log4perl::NDC->push("prefix");
Log::Log4perl->get_logger()->info("second message");

Это печатает:

[undef] first message
prefix second message

Но я хочу, чтобы он печатал:

first message
prefix second message

Как я могу это сделать?


person Flimm    schedule 17.09.2013    source источник


Ответы (1)


%x явно задокументировано как возвращающее [undef], если в NDC ничего нет. куча. Так что со стандартным %x вам не повезло. Однако, используя самоопределяемый заполнитель и изучая внутренности NDC, вы можете отформатировать вывод по своему усмотрению, например:

Log::Log4perl::Layout::PatternLayout::add_global_cspec('U', sub {
    @Log::Log4perl::NDC::NDC_STACK ? join(" ", @Log::Log4perl::NDC::NDC_STACK) . " " : ''
});

Затем просто используйте

Log::Log4perl->easy_init({ level => $INFO, layout => "%U%m%n" });

(обратите внимание на отсутствие пробела после %U здесь).

Было бы лучше, если бы текущий NDC_STACK был доступен по функциям или если бы существующие переменные были задокументированы. Может быть, спросить разработчиков log4perl, могут ли они сделать и то, и другое?

person Slaven Rezic    schedule 17.09.2013