Hi users,
I have been stuck with a problem eating way my time and energy.
My goal: create one generic appender with parameters which can be used for
multiple loggers and the parameters to it will be furnished during runtime.
Thus, creating a "dynamic" appender which spans through multiple loggers.
This is my
<Routing name="defaultAppender">
<Routes>
<Script name="RoutingInit" language="JavaScript">
<![CDATA[
if (logEvent.getLevel().intLevel() >= 400) {
"info-logs";
} else {
"error-logs";
}
]]>
</Script>
<Route key="info-logs">
<RollingRandomAccessFile name="rrafAppenderDsp-${ctx:file}"
fileName="${ctx:dir}/${ctx:file}.log"
filePattern="${ctx:gzip-dir}/${ctx:file}_%d{dd-MM-yyyy}_%i.log.gz"
append="true" immediateFlush="false"
bufferSize="${ctx:bufferSize}">
<PatternLayout>
<pattern>${ctx:pattern}</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="${ctx:rollover-filesize}"/>
</Policies>
<DefaultRolloverStrategy
compressionLevel="${ctx:gzip-compression}">
<Delete basePath="${ctx:gzip-dir}">
<IfFileName glob="*/${ctx:file}_*.log.gz"/>
<IfLastModified age="${ctx:gzip-purgetime}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Route>
<Route key="error-logs">
<RollingRandomAccessFile name="rrafAppenderDsp"
fileName="${ctx:dir}/${ctx:file}_errors.log"
filePattern="${ctx:gzip-dir}/${ctx:file}_errors_%d{dd-MM-yyyy}_%i.log.gz"
append="true" immediateFlush="false"
bufferSize="${ctx:bufferSize}">
<PatternLayout>
<pattern>${root.linePattern}</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="${ctx:rollover-filesize}"/>
</Policies>
<DefaultRolloverStrategy
compressionLevel="${ctx:gzip-compression}">
<Delete basePath="${ctx:gzip-dir}">
<IfFileName glob="*/${ctx:file}_errors_*.log.gz"/>
<IfLastModified age="${ctx:gzip-purgetime}"/>
</Delete>
</DefaultRolloverStrategy>
</RollingRandomAccessFile>
</Route>
</Routes>
</Routing>
<Logger name="logger1" level="INFO" additivity="false">
<AppenderRef ref="defaultAppender"/>
</Logger>
<Logger name="logger2" level="INFO" additivity="false">
<AppenderRef ref="defaultAppender"/>
</Logger>
<Logger name="logger3" level="INFO" additivity="false">
<AppenderRef ref="defaultAppender"/>
</Logger>?
the contextual params are filled as follows
// this called by each logger while logging
public void log(Level logingLevel, String data) {
// this loads the ?contextual params into ThreadContext
loadPropertiesToContext();
logger.log(logingLevel, data);
ThreadContext.clearMap();
}?
Now, the problem is, the same settings works fine for one logger , but as soon
as l use the same appender for multiple loggers, the data is being mixed up and
if logger1 has to written in file1 and logger2 to file2, both the logevents are
being written in file1. As I imagined, routing appender uses current
threadcontext to dynamically 'route' the events, the above settings should work.
Has anyone had the same experience? or would like to pitch in on how to make
this work ?
Cheers!
Chandra?