4

使用log4perl时,我使用的调试日志布局是:

log4perl.appender.D10.layout=PatternLayout
log4perl.appender.D10.layout.ConversionPattern=%d [pid=%P] %p %F{1} (%L) %M %m%n
log4perl.appender.D10.Filter = DebugAndUp

这会产生非常详细的调试日志,例如:

2008/11/26 11:57:28 [pid=25485] DEBUG SomeModule.pm (331) functions::SomeModule::Test Test XXX was successfull
2008/11/26 11:57:29 [pid=25485] ERROR SomeOtherUnrelatedModule.pm (99999) functions::SomeModule::AnotherTest AnotherTest YYY has faled

这很好用,并提供了出色的调试数据。

但是,调试日志的每一行都包含不同的函数名称、pid 长度等。这使得每一行的布局不同,并且使得阅读调试日志比需要的要困难得多。

log4perl 中是否有办法格式化该行,以便调试元数据(直到实际日志消息的所有内容)在末尾用空格/制表符填充,并让实际消息从同一列文本开始?

4

2 回答 2

8

您可以填充构成条目的单个字段。例如 [pid=%5P] 将始终为您提供至少 5 个字符作为 PID。

Log::Log4perl::Layout 文档中的“量化占位符”部分提供了更多详细信息。

于 2008-11-26T11:58:14.097 回答
5

有几种方法可以解决这个问题,但您必须弄清楚哪一种更适合您的情况:

  1. 如果您正在现场工作,请使用不同的附加程序。让该附加程序使用仅显示您想要的信息的模式。例如,如果您在单个进程中工作,则备用附加程序可能会省略 PID 和时间戳。您可能只需要文件名和行号。

  2. 用于%n将换行符放在正确的位置。这使得它是多行输出,稍后解析稍微困难一些,但您可以为输入记录分隔符选择另一个序列(例如,文字“[EOL]”),以便逐个条目地阅读。

  3. 记录到数据库而不是文件。对于您的报告,只选择您要检查的列。

  4. 记录所有内容,但编写一个过滤器来临时检查日志文件以仅显示您想要查看的部分,例如仅调试消息、特定时间之间的条目、仅涉及文件的条目等.

于 2008-11-26T12:23:48.647 回答