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?

Reply via email to