How to route message to file created dynamically.
This is already embedded in the core log4j functionality when you combine:
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.
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);
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>