Table of Contents

Log4j - How to route message to log file created dynamically

About

How to route message to file created dynamically.

This is already embedded in the core log4j functionality when you combine:

Example: Analytics Application

Definition

This steps are for a analytics application that logs event (such as click button, video played,…)

Every event type must be routed to a different log files.

Steps

Context Data

You need to put context data before logging.

Example:

String event_type = "video_play";
ThreadContext.put("event_type", event_type);
logger.info(message);
String event_type = "video play";
MDC.put("event_type", event_type);
logger.info(message);

Configuration: RoutingAppender

The RoutingAppender allows to route a message to an appender created dynamically.

Below:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
  <Appenders>
    <Routing name="Analytics" ignoreExceptions="false">
      <Routes pattern="${ctx:event_type}">
        <Route>
          <RollingFile
            name="analytics-${ctx:event_type}"
            fileName="logs/analytics/${ctx:event_type}.jsonl"
            filePattern="logs/analytics/$${date:yyyy-MM}/analytics-${ctx:event_type}-%d{yyyy-dd-MM-}-%i.jsonl.gz">
            <PatternLayout>
              <pattern>%m%n</pattern>
            </PatternLayout>
            <Policies>
              <TimeBasedTriggeringPolicy/>
              <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
          </RollingFile>
        </Route>
      </Routes>
      <!-- Created appender TTL -->
      <IdlePurgePolicy timeToLive="15" timeUnit="minutes"/>
    </Routing>
  </Appenders>
  <Loggers>
    <Logger name="net.bytle.api.http.AnalyticsLogger" level="debug" additivity="false">
      <AppenderRef ref="Analytics"/>
    </Logger>
  </Loggers>
</Configuration>
XML

Documentation / Reference