如何让log4perl输出更容易阅读?

时间:2008-11-26 11:09:03

标签: perl logging log4perl

使用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中是否有一种格式化行的方法,以便调试元数据(直到实际日志消息的所有内容)在末尾用空格/制表符填充,并使实际消息从同一列文本开始?

2 个答案:

答案 0 :(得分:8)

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

Log :: Log4perl :: Layout文档中的"Quantify Placeholders" section提供了更多详细信息。

答案 1 :(得分:5)

有几种方法可以解决这个问题,但你必须找出哪种方法可以更好地适应你的情况:

  1. 如果您正在工作,请使用其他appender。让appender使用只显示所需信息的模式。例如,如果您在单个进程中工作,则备用appender可能会忽略PID和时间戳。您可能只需要文件名和行号。

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

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

  4. 记录所有内容,但编写一个过滤器以通过日志文件ad-hoc显示您想要查看的部分,例如仅调试消息,特定时间之间的条目,仅涉及的条目一个文件,依此类推。