3

我有一个关于 MapFilters 的简单问题。好吧,我知道什么是映射:简单的键值对。现在 log4j 允许通过(来自网站的示例)过滤所谓的地图消息:

  <MapFilter onMatch="ACCEPT" onMismatch="DENY" operator="or">
    <KeyValuePair key="eventId" value="Login"/>
    <KeyValuePair key="eventId" value="Logout"/>
  </MapFilter>

但是我在代码中的哪里定义这些消息。我试过这样的:

    MapMessage mm = new MapMessage();
    mm.put("eventId", "Login");
    logger.exit(mm);

但这不是处理这个问题的一种方便的方法,顺便说一句:它不起作用。

你知道这个话题更详细的介绍吗?API在这里并没有真正帮助我。

谢谢大家!

4

1 回答 1

3

我在配置时遇到了上述问题MapFilterThreadContextMapFilter以类似的方式工作,但在这种情况下,我们必须填充ThreadContext地图并且一切正常。成功背后的原因ThreadContextMapFilterThreadContextmap 是基于上下文的,它对同一上下文中的所有日志事件都有效,但MapFilter它的工作原理MapMessage不是基于上下文 (MapMessage),而是基于事件,因此对于每个日志事件我们必须传递MapMessageas 参数MapFilter才能工作。

相关配置和代码:

<configuration status="WARN" name="abcd">
    <properties/>
    <MapFilter onMatch="ACCEPT" onMismatch="DENY">
        <KeyValuePair key="Mic" value="Mic123"/>
    </MapFilter>                 
        ...........
        ........... <<Put other relevant configurations here>>
</configuration>

Java代码:

public static void main(String args[]) {
    MapMessage mapMessage = new MapMessage();

    mapMessage.put("Mic", "Mic123");
    log4j2Tester.logger.debug(mapMessage,new Exception("Okies"));
    log4j2Tester.logger.debug(mapMessage);
}

在上面的代码中,log4j2Tester是我的独立类的对象,logger是配置的记录器。

希望这篇文章能解决你的问题。快乐编码。

于 2013-05-19T09:18:59.487 回答