有没有办法在Log4j2中使用RoutingAppender基于Marker路由日志

时间:2015-05-07 21:12:30

标签: java logging log4j2

可以使用标记filter消息,例如:

      <MarkerFilter marker="FLOW" onMatch="ACCEPT" onMismatch="DENY"/>

但是我正在尝试使用RoutingAppender根据标记路由邮件。我不想在多个Appender中多次过滤相同的参数。这是我的配置示例(yaml):

Routing:
  name: ROUTING_APPENDER
  Routes:
    pattern: "$${ctx:marker}" #<-- How to use Marker here?
    Route:
      - key: MyRoutingKey
        ref: MyCustomAppender

文件规定:

  

针对所有已注册的Lookup和   结果用于选择路线

然而,标记似乎没有Lookup,LogLevel也是如此。可以在ThreadContextMap中添加自定义 MarkerValue LogLevelValue ,但我发现解决方案并不真正有效,它会复制已知信息。

没有记录或只是不可能吗?是否应该有一种内置方式可以在Lookup中访问这些值?

1 个答案:

答案 0 :(得分:2)

RoutingAppender的文档显示了ThreadContext查找,但路由也可以与其他查找一起使用。一个想法是创建自定义查找。

自定义查找是作为log4j2插件实现的。要帮助log4j2找到您的插件,您可以在配置文件中启用 packages =&#34; yourCustomPackage&#34; 。你的插件类需要在类路径上,所以log4j可以找到它。这是自定义查找的插件代码:

import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

@Plugin(name = "marker", category = "Lookup")
public class MarkerLookup implements StrLookup {

    public String lookup(String key) {
        return null
    }

    public String lookup(LogEvent event, String key) {
        final Marker marker = event.getMarker();
        return marker == null ? null : marker.getName();
    }
}

在配置文件中:

Routing:
  name: ROUTING_APPENDER
  Routes:
    pattern: "$${marker:}"
    Route:
    - key: PERFORMANCE
      ref: PERFORMANCE_APPENDER
    - key: PAYLOAD
      ref: PAYLOAD_APPENDER
    - key: FATAL
      ref: FATAL_APPENDER
    - ref: APPLICATION_APPENDER #Default route

致Log4j2开发人员(https://issues.apache.org/jira/browse/LOG4J2-1015)。

更新:根据他们的说法,它应该在下一个版本(2.4)中内置。因此,之后不需要编写自定义插件。