Hello,
I'm trying to obtain a certain logging configuration, but so far I'm 
unsuccessful. I've read through the Logback manual, but I don't know if I can 
do what I want.
It is a web application, and my objective is to enable a finer logging level 
for specific users, getting written to a specific log file, allowing better 
debugging directly in production environment. When needed, someone will set a 
tuned XML config using JMX to enable logging for the duration of the tests/data 
gathering (JMX is working fine). This is the relevant part of my logback.xml 
file:
<configuration debug="true">
        ...
        <appender name="FILTERED" 
class="ch.qos.logback.core.rolling.RollingFileAppender">               <filter 
class="com.sample.project.UserFilter">                 <!--                     
       //filter code                           if (level != null && 
!event.getLevel().isGreaterOrEqual(level)) {                                    
   return FilterReply.DENY;                                }                    
           if (user.equals(MDC.get("userId"))) {                                
   return FilterReply.ACCEPT;                              } else {             
                           return FilterReply.DENY;                             
   }
                        -->                     <level>DEBUG</level>            
        <user>123456</user>              </filter>                              
...     </appender>
        <logger name="com.sample.project">              <appender-ref 
ref="FILTERED" /> </logger>       <logger name="com.sample.legacy" 
additivity="false">            <appender-ref ref="LEGACY" />   </logger>       
<root level="WARN">             <appender-ref ref="STANDARD" /> </root>
</configuration>
With this config, I intend to have:- WARN+ level at root;- events from legacy 
project tree only on 'LEGACY' (working fine);- 'FILTERED' logging only DEBUG+ 
events from user '123456' under 'com.sample.project', while its level ramains 
at WARN (not OK).
Sample:getLogger("com.sample.abc").warn("...");      //logged to 
STANDARDgetLogger("com.sample.abc").debug("...");     //not 
loggedgetLogger("com.sample.legacy").warn("...");   //logged to 
LEGACYgetLogger("com.sample.project").warn("...");  //logged to STANDARD; also 
logged to FILTERED if user is 
123456getLogger("com.sample.project").debug("..."); //logged to FILTERED if 
user is 123456
As I tested, a 'logger.debug()' from the desired user does not get logged, the 
filter is not even called, and I suspect that the effective WARN level denies 
the event before reaching my filter (I hoped for the other way around). If I 
set DEBUG on 'com.sample.project', 'FILTERED' will get the correct logging, but 
'STANDARD' will be flooded with DEBUG+ logging from 'com.sample.project'. And 
disabling additivity on it removes all logging belonging to this hierarchy from 
'STANDARD'.
So, I see Logback is working properly, my desired logging seems to be against 
the standard architecture. But is there a way to archive the described effect?I 
was thinking of a TurboFilter, allowing lower level events from selected users 
(not tested yet), but I'm not sure the effective level would kick in first, 
also it wouldn't do the desired logging separation between 'STANDARD' and 
'FILTERED' anyway. As another approach, maybe this would require a custom 
Logger class, handling specific appenders in a special way. Unfortunately, I 
have no idea if I can plug in custom Loggers, and also not sure how to code it 
(Logger class source is quite complex in a quick look).
Sorry if it wasn't clear, I'm not sure how to present the situation. I can 
provide further details, if needed.Any help is welcome. If someone could show 
me which way to follow, maybe classes or methods to extend, I'd be grateful.
Many thanks!



                                          
_______________________________________________
Logback-user mailing list
[email protected]
http://mailman.qos.ch/mailman/listinfo/logback-user

Reply via email to