我正在使用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 -
(最后有一个空格)。显然,需要使用$符号关闭正则表达式,以便包含消息。
我在模式定义中犯了什么错误吗?
答案 0 :(得分:0)
最后一个括号包含一个惰性量词:.*?
表示“匹配零个或多个字符,尽可能少”。这意味着空字符串是一个有效的匹配(这在你的正则表达式的其他部分是有意义的,因为有些东西跟随你不想被正则表达式的前一部分吞噬)。
使用.*
代替“匹配零个或多个字符,尽可能多”:
(.*?) +\[(.*?)\] +(\S*\s*?) +(\S*\s*?) +(.*) +- +(.*)
答案 1 :(得分:0)
为LogFilePatternReceiver尝试此LogFormat(注意*通配符)
PROP(RELATIVETIME)[THREAD] LEVEL LOGGER * PROP(X) - MESSAGE