How to create custom RewritePolicy in log4j2?

I am trying to encode my own RewritePolicy in Log4j2. The documentation states that:

RewritePolicy is an interface that allows implementations to validate and possibly modify LogEvents before they are passed to Appender. RewritePolicy declares one method called rewrite, which must be implemented. The method is passed by LogEvent and can return the same event or create a new one.

Here is my java class :

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 a Marker, add it to the ThreadContextMap so the RoutingAppender can properly routes log messages event.getContextMap().put("_marker", marker.getName()); return event; } } 

Here is my yaml configuration file:

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

However, I have no idea how to insert it into the configuration file. How can I make it work at runtime?

+3
java logging configuration log4j log4j2
source share
2 answers

Your custom rewrite policy should be encoded as the log4j2 plugin. This allows you to configure custom RewritePolicy in RewriteAppender.

 @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 a Marker, add it to the ThreadContextMap // so the RoutingAppender can properly routes log messages // event context map is immutable, so need to make a copy... Map<String, String> 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; } } 

Config example (TODO: set the correct value for the packet attribute):

 <Configuration status="trace" packages="my.rewritepolicy.plugin.package"> <Appenders> <Console name="STDOUT"> <PatternLayout pattern="[%-5level] %c{1.} %m%n"/> </Console> <Rewrite name="Rewrite"> <InjectMarkerPolicy /> <AppenderRef ref="STDOUT"/> </Rewrite> </Appenders> <Loggers> <Root level="trace"> <AppenderRef ref="Rewrite"/> </Root> </Loggers> </Configuration> 
+2
source share

Do not forget the Factory method for your plugin, otherwise it will not start:

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

here is a working example of my github account: https://github.com/sercasti/Log4j-RewriteAppender/

+2
source share

All Articles