About
How to route message to file created dynamically.
This is already embedded in the core log4j functionality when you combine:
- with context data
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:
- Log4j
String event_type = "video_play";
ThreadContext.put("event_type", event_type);
logger.info(message);
- or if you use slf4j as a facade
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:
- There is one routing called Analytics
- That defines Routes that defines a pattern that should match the key attribute of the Route.
- As, there is only one Route, a log will go to the RollingFile route
- The RollingFile use context data to create different appender based on its name
- The IdlePurgePolicy defines when to delete this appender from memory.
- The Logger node set this RoutingAppender to the Analytics class net.bytle.api.http.AnalyticsLogger
<?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>