Log4j可选格式修饰符和LogFilePatternReceiver正则表达式匹配

时间:2011-07-09 08:03:45

标签: java regex log4j pattern-matching apache-chainsaw

我正在使用Log4j LogFilePatternReceiver类来读取一些简单的日志文件,并想知道是否有任何方法可以告诉Log4j将格式修饰符解释为可选。

例如,假设以下模式:

%r [%t] %p %c %x - %m%n

匹配字符串

123 [main] INFO org.apache.log4j.whatever x=8 - Just a message.

但不是字符串

123 [main] INFO org.apache.log4j.whatever - Just a message.

(即,与上述相同,但没有“x = 8”部分)。

有没有办法告诉Log4j匹配两者?

在另一个相关的说明中,在LogFilePatternReceiver的源代码中添加了几个额外的打印语句,我得到了

Pattern: {%r [%t] %p %c %x - %m%n}
Regex:   {(.*?)[ ]+\[(.*?)\][ ]+(\S*\s*?)[ ]+(\S*\s*?)[ ]+(.*)[ ]+\-[ ]+(.*?)}

其中大括号只是表示每个表达式的开始/结束而不属于它,只是为了确保没有涉及额外的空格或其他字符。正则表达式由LogFilePatternReceiver方法末尾的initialize()创建。

regexpal.com中尝试使用正则表达式,我只得到除了邮件之外的部分匹配,即匹配是,根据regexpal,

123 [main] INFO org.apache.log4j.whatever x=8 - 

(最后有一个空格)。显然,需要使用$符号关闭正则表达式,以便包含消息。

我在模式定义中犯了什么错误吗?

2 个答案:

答案 0 :(得分:0)

最后一个括号包含一个惰性量词:.*?表示“匹配零个或多个字符,尽可能少”。这意味着空字符串是一个有效的匹配(这在你的正则表达式的其他部分是有意义的,因为有些东西跟随你不想被正则表达式的前一部分吞噬)。

使用.*代替“匹配零个或多个字符,尽可能多”:

(.*?) +\[(.*?)\] +(\S*\s*?) +(\S*\s*?) +(.*) +- +(.*)

答案 1 :(得分:0)

为LogFilePatternReceiver尝试此LogFormat(注意*通配符)

PROP(RELATIVETIME)[THREAD] LEVEL LOGGER * PROP(X) - MESSAGE