0

我正在使用 Log4jLogFilePatternReceiver类来读取一些简单的日志文件,并且想知道是否有任何方法可以告诉 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中的正则表达式,我只得到不包括消息的部分的匹配,即匹配是,根据正则表达式,

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

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

我在模式定义中犯了任何错误吗?

4

2 回答 2

0

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

PROP(RELATIVETIME) [线程] 级别记录器*PROP(X) - 消息

于 2011-07-10T06:35:30.997 回答
0

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

使用.*instead 表示“匹配零个或多个字符,尽可能多”:

(.*?) +\[(.*?)\] +(\S*\s*?) +(\S*\s*?) +(.*) +- +(.*)
于 2011-07-09T10:06:30.653 回答