How to create custom RewritePolicy in log4j2?

后端 未结 2 468
既然无缘
既然无缘 2020-12-19 21:45

I\'m trying to code my own RewritePolicy in Log4j2. The documentation states that :

RewritePolicy is an interface that allows implementations to insp

相关标签:
2条回答
  • 2020-12-19 21:56

    Don't forget the Factory Method for your plugin or it will fail to start:

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

    here's a working example on my github account: https://github.com/sercasti/Log4j-RewriteAppender/

    0 讨论(0)
  • 2020-12-19 22:09

    Your custom rewrite policy should be coded as a log4j2 plugin. This enables you to configure your custom RewritePolicy in a 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'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<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;
        }
    }
    

    Example config (TODO: set correct value for packages 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>
    
    0 讨论(0)
提交回复
热议问题