[logback-user] using different appenders based on MDC value

Stefan Armbruster ml001 at armbruster-it.de
Sun Feb 17 20:28:56 CET 2008


Assume a clustered webapp distributed to multiple servers running tomcat (e.g. 
app1, app2, app3). Since appX are diskless servers, the webapp's logback.xml 
simply uses SocketAppender to redirect all log messagess to a central logging 
server.
The webapp uses a servlet filter (similar to 
http://logback.qos.ch/manual/mdc.html) to populate the MDC with the server's 
IP number. 
The central logging server receives all log messages from app1-appX using 
SimpleSocketServer and writes them to a single file using the following 
config:

<appender name="default" 
class="ch.qos.logback.core.rolling.RollingFileAppender">
 <file>default.log</file>
 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
   <FileNamePattern>default-%d{yyyy-MM-dd}.log</FileNamePattern>
 </rollingPolicy>

 <layout class="ch.qos.logback.classic.PatternLayout">
   <Pattern>%d{ISO8601} [%thread] S:%X{server} %-5level 
     %logger{36} - %msg%n</Pattern>
 </layout>
</appender>

Note that the server's IP appears inside the logfile, nothing new until now. 
The goal is to have multiple logfiles ( 1 per server IP number), e.g.
	default_192.168.0.1.log
	default_192.168.0.2.log
	...
	default_192.168.0.n.log

So the appender must be aware of the server's ip number stored in the MDC map.
I hope this spreads some more light on my use case.

Regards,
Stefan


Am Sonntag, 17. Februar 2008 schrieb Ceki Gulcu:
> Stefan,
>
> Could you please expand on the use case?
>
> Stefan Armbruster wrote:
> > Hi,
> >
> > is there a way to redirect log messages depending on a MDC variable to
> > different appenders? The logback manual only uses MDC values for the
> > pattern inside a single appender.
> >
> > Example: assume, the code sets a MDC variable "context". If a log message
> > is supplied with context="A", it should be written to application_A.log,
> > if it has context="B", the message should be written to
> > application_B.log, and so on.
> >
> > If this is not possible by default, it should be possible to write a kind
> > of MDCAwareAppenderWrapper like this (only pseudo code below):
> >
> > public class MDCAwareAppenderWrapper<E> implements Appender<E> {
> > 	Map<String,Appender> appenderMap;
> > 	String mdcName;
> >
> > 	... setters and getters omitted
> >
> > 	public void doAppend(E event) {
> > 		LoggingEvent le = (LoggingEvent)event;
> > 		String mdcValue = le.getMDCPropertyMap().get(mdcName);
> > 		Appender appender = appenderMap.get(mdcValue);
> > 		appender.doAppend(event);
> > 	}
> > }
> >
> > MDCAwareAppenderWrapper is configured by a Map<String,Appender> that maps
> > MDC values (A and B from the example above) to the real appenders.
> >
> > Any hints or comments on that?
> >
> > Kind regards,
> > Stefan
> > _______________________________________________
> > Logback-user mailing list
> > Logback-user at qos.ch
> > http://qos.ch/mailman/listinfo/logback-user



More information about the Logback-user mailing list