【问题标题】:Log4j Optional Format Modifiers and LogFilePatternReceiver Regular Expression MatchingLog4j 可选格式修饰符和 LogFilePatternReceiver 正则表达式匹配
【发布时间】:2011-07-09 08:03:45
【问题描述】:

我正在使用 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 中的正则表达式,我只得到了不包括消息的部分的匹配,即匹配是,根据正则表达式,

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    改用.*,意思是“匹配零个或多个字符,尽可能多”:

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

    【讨论】:

    • 是的,但我不控制那个正则表达式,它是由 Log4j 的 LogFilePatternReceiver 类生成的。 :-)
    【解决方案2】:

    为您的 LogFilePatternReceiver 试试这个 LogFormat(注意 * 通配符)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      相关资源
      最近更新 更多