使用属性文件为log4j多个过滤器

时间:2015-12-04 09:41:57

标签: java filter configuration log4j

我正在尝试使用此配置过滤日志消息(我假装忽略包含文本Could not refresh JMS Connection for destination的消息以及包含org.apache.activemq.transport.failover.FailoverTransport的消息):

log4j.appender.stdout.filter.1=org.apache.log4j.varia.StringMatchFilter
log4j.appender.stdout.filter.1.StringToMatch=Could not refresh JMS Connection for destination
log4j.appender.stdout.filter.1.AcceptOnMatch=false
log4j.appender.stdout.filter.2=org.apache.log4j.varia.StringMatchFilter
log4j.appender.stdout.filter.2.StringToMatch=org.apache.activemq.transport.failover.FailoverTransport
log4j.appender.stdout.filter.2.AcceptOnMatch=false

但只有第一个过滤器正常工作。配置多个过滤器的正确方法是什么?

我正在使用log4j 1.2.17版本。

2 个答案:

答案 0 :(得分:1)

如果第一个过滤器传递DENYACCEPT,则第二个过滤器未被调用。

如果返回值为NEUTRAL,则调用第二个过滤器。 我不确定,但你可以在一个过滤器中使用正则表达式。

source link

答案 1 :(得分:1)

我已经进行了广泛的研究,据我所知,该方法会随着时间的推移而有所变化,具体取决于您的版本。因此,我发现了应该可以使用的三种方法,但只有版本1适用于我:

使用过滤器元素

log4j2.appender.event.filter.1.type = Filters

log4j2.appender.event.filter.1.a.type = RegexFilter
log4j2.appender.event.filter.1.a.regex = .*(C_Radon_(Level|Updated|Running)|C_Solar_(PowerTotal|PowerEast|PowerWest|TotalYield|DailyYield)|OFFLINE.*10\.13\.0\.70).*
log4j2.appender.event.filter.1.a.onMatch = DENY
log4j2.appender.event.filter.1.a.onMismatch = NEUTRAL

log4j2.appender.event.filter.1.b.type = RegexFilter
log4j2.appender.event.filter.1.b.regex = .*(C_Air_).*
log4j2.appender.event.filter.1.b.onMatch = DENY
log4j2.appender.event.filter.1.b.onMismatch = NEUTRAL

这可能会在控制台中生成并出错

org.ops4j.pax.logging.pax-logging-api [log4j2] ERROR : Filters contains invalid attributes "onMatch", "onMismatch" Ignored FQCN: org.apache.logging.log4j.spi.AbstractLogger

但是可以放心地忽略

2在过滤器属性上直接使用类型属性和多个过滤器

根据源代码,这应该可以工作。 https://github.com/apache/log4j/blob/7be00eed88152dd011a619e8bae5a631235c3f4c/src/main/java/org/apache/log4j/PropertyConfigurator.java#L881

## Danfoss Air Updates (because the key is cair this will be the first filter)
log4j2.appender.event.filter.1.type = RegexFilter
log4j2.appender.event.filter.1.regex = .*(Solar_PowerTotal).*
log4j2.appender.event.filter.1.onMatch = DENY
log4j2.appender.event.filter.1.onMismatch = NEUTRAL

## Frequest updates
log4j2.appender.event.filter.2.type = RegexFilter
log4j2.appender.event.filter.2.regex = .*(C_Solar_PowerWest).*
log4j2.appender.event.filter.2.onMatch = DENY
log4j2.appender.event.filter.2.onMismatch = NEUTRAL

3使用上面记录的方法

这实际上是log4j文档中正式记录的方法: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html#method_detail

在docs中指定直接在过滤器ID上使用该名称,并具有完全限定的名称(在openHAB2中从不为我使用)

log4j2.appender.event.filter.1 = org.apache.logging.log4j.core.filter.RegexFilter
log4j2.appender.event.filter.1.regex = .*(C_Radon _(Level|Updated|Running)|C_Solar_(PowerTotal|PowerEast|PowerWest|TotalYield|DailyYield)|OFFLINE.*10\.13\.0\.70).*
log4j2.appender.event.filter.1.onMatch = DENY
log4j2.appender.event.filter.1.onMismatch = NEUTRAL

log4j2.appender.event.filter.2 = org.apache.logging.log4j.core.filter.RegexFilter
log4j2.appender.event.filter.2.regex = .*(C_Air_).*
log4j2.appender.event.filter.2.onMatch = DENY
log4j2.appender.event.filter.2.onMismatch = NEUTRAL

要注意的其他事项:

正则表达式过滤器的onMismatch名称已从onMisMatch更改为onMismatch,并且错误消息实际上给出了错误消息(因此,如果您键入onMisMatch将会抱怨键入了错误的onMismatch,这很有趣;-)

多个过滤器应返回NEUTRAL,以使过滤器链继续。 (最后一个过滤器可能是DENY / ACCEPT)

过滤器按ID排序,这就是为什么将ID作为数字或单个字母比实际命名更容易阅读的原因。