如何在log4j2中创建自定义RewritePolicy?

我正在尝试在Log4j2中编写自己的RewritePolicy。 文件说明:

RewritePolicy是一个接口,允许实现在将LogEvent传递给Appender之前检查并可能修改它们。 RewritePolicy声明了一个必须实现的名为rewrite的方法。 该方法传递给LogEvent,可以返回相同的事件或创建一个新事件。

这是我的java类

public final class MarkerInjectorRewritePolicy implements RewritePolicy { @Override public LogEvent rewrite(final LogEvent event) { final Marker marker = event.getMarker(); if (marker == null) return event; // If there's a Marker, add it to the ThreadContextMap so the RoutingAppender can properly routes log messages event.getContextMap().put("_marker", marker.getName()); return event; } } 

这是我的yaml配置文件:

 Rewrite: name: REWRITE_APPENDER AppenderRef: ref: ROUTING_APPENDER PropertiesRewritePolicy: Property: - name: foo value: bar 

但是我不知道如何在我的配置文件中注入它。 如何在运行时使其工作?

您的自定义重写策略应编码为log4j2插件。 这使您可以在RewriteAppender中配置自定义RewritePolicy。

 @Plugin(name = "InjectMarkerPolicy", category = "Core", elementType = "rewritePolicy", printObject = true) public final class MarkerInjectorRewritePolicy implements RewritePolicy { @Override public LogEvent rewrite(final LogEvent event) { final Marker marker = event.getMarker(); if (marker == null) return event; // If there's a Marker, add it to the ThreadContextMap // so the RoutingAppender can properly routes log messages // event's context map is immutable, so need to make a copy... Map mdc = new HashMap<>(event.getContextMap()); mdc.put("_marker", marker.getName()); LogEvent result = new Log4jLogEvent(event.getLoggerName(), event.getMarker(), event.getLoggerFqcn(), event.getLevel(), event.getMessage(), event.getThrown(), mdc, event.getContextStack(), event.getThreadName(), event.getSource(), event.getTimeMillis()); return result; } } 

示例配置(TODO:为packages属性设置正确的值):

                 

不要忘记插件的工厂方法,否则将无法启动:

  @PluginFactory public static MarkerInjectorRewritePolicy createPolicy() { return new MarkerInjectorRewritePolicy(); } 

这是我的github帐户的一个工作示例: https : //github.com/sercasti/Log4j-RewriteAppender/