如何让Log4perl中的%x不显示“[undef]”?

时间:2013-09-17 11:28:09

标签: perl log4perl

当我没有将任何内容推送到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

我该怎么做?

1 个答案:

答案 0 :(得分:2)

如果NDC堆栈上没有任何内容,则

%x显式为documented,返回[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开发人员是否可以同时执行这两项工作?