using different appenders based on MDC value

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

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@qos.ch http://qos.ch/mailman/listinfo/logback-user
-- -- Ceki Gülcü QOS.ch is looking to hire talented developers in Switzerland. If interested, please contact c e k i @ q o s . c h

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@qos.ch http://qos.ch/mailman/listinfo/logback-user

You could separate the log statements as a post-processing step (generating the one-file-per-server-IP - say on a daily basis). We do something like that, but in our case the aggregate log file has a value by itself. Peter -----Original Message----- From: logback-user-bounces@qos.ch [mailto:logback-user-bounces@qos.ch] On Behalf Of Stefan Armbruster Sent: Sunday, February 17, 2008 1:29 PM To: logback users list Subject: Re: [logback-user] using different appenders based on MDC value 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@qos.ch http://qos.ch/mailman/listinfo/logback-user
Logback-user mailing list Logback-user@qos.ch http://qos.ch/mailman/listinfo/logback-user **************************************************************************** This email may contain material confidential to Pearson. If you were not an intended recipient, please notify the sender and delete all copies. We may monitor email to and from our network. ****************************************************************************

Hello Pascale, I think generating the one-file-per-server-IP can be achieved through Joran's replay capability. However, that's a relatively sophisticated and ill-documented technique. At this time, I suggest that you either enter a bug report asking for this feature or implement it on your own by adapting currently existing code. Best regards, Pascale, Peter H. wrote:
You could separate the log statements as a post-processing step (generating the one-file-per-server-IP - say on a daily basis). We do something like that, but in our case the aggregate log file has a value by itself.
Peter
-----Original Message----- From: logback-user-bounces@qos.ch [mailto:logback-user-bounces@qos.ch] On Behalf Of Stefan Armbruster Sent: Sunday, February 17, 2008 1:29 PM To: logback users list Subject: Re: [logback-user] using different appenders based on MDC value
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@qos.ch http://qos.ch/mailman/listinfo/logback-user
Logback-user mailing list Logback-user@qos.ch http://qos.ch/mailman/listinfo/logback-user
**************************************************************************** This email may contain material confidential to Pearson. If you were not an intended recipient, please notify the sender and delete all copies. We may monitor email to and from our network. **************************************************************************** _______________________________________________ Logback-user mailing list Logback-user@qos.ch http://qos.ch/mailman/listinfo/logback-user
-- Ceki Gülcü QOS.ch is looking to hire talented developers in Switzerland. If interested, please contact c e k i @ q o s . c h
participants (4)
-
Ceki Gulcu
-
Ceki Gulcu
-
Pascale, Peter H.
-
Stefan Armbruster