2

当我没有向 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

我怎样才能做到这一点?

4

1 回答 1

2

%x如果 NDC 堆栈上没有任何内容,则明确记录为返回。[undef]因此,使用标准%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 开发人员他们是否可以同时做这两个?

于 2013-09-17T11:53:42.377 回答