[logback-dev] [JIRA] Commented: (LBCLASSIC-178) Logger.callAppenders() doesn´t call TurboFilters

David Sanz (JIRA) noreply-jira at qos.ch
Sun Jan 3 20:14:33 CET 2010

    [ http://jira.qos.ch/browse/LBCLASSIC-178?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=11490#action_11490 ] 

David Sanz commented on LBCLASSIC-178:

Hi Ralph,

Thank you for your response.
I am sorry for making such a horrible proposal.
I supposed that the modification I proposed, wouldn´t be the good one.  But at least it have let me to explain the problem.
I don´t know logback´s code in deep. But the reasons argued by you are quite rational.

The solution you prosose fits also my needs, whenever the new method:
log(ILoggingEvent) calls the turbofilters and thus checks ReconfigureOnChangeFilter 

After modifying it would be necessary to update also  logback´s manual to make reference to the new method instead of callAppender in:
Chapter 4 : JMSTopicAppender

Thanks again,

> Logger.callAppenders() doesn´t call TurboFilters
> ------------------------------------------------
>                 Key: LBCLASSIC-178
>                 URL: http://jira.qos.ch/browse/LBCLASSIC-178
>             Project: logback-classic
>          Issue Type: Bug
>    Affects Versions: 0.9.18
>         Environment: Platform independent
>            Reporter: David Sanz
>            Assignee: Ceki Gulcu
> Using JMSQueueAppender for remote logging, and Logger.callAppenders() in the server sid,e never reload de logback configuration files.
> I am developing a client application, let´s say App1.
> App1 use the logback JMSQueueAppender, to deliver logging events to a Message Driven Bean, in the server side.
> As proposed in the logback manual my Message Driven Bean implements the following lines (simplified to make the explanation easier to understand)
> public void onMessage(javax.jms.Message message) {
>   ILoggingEvent event;
>  ...
>   ObjectMessage objectMessage = (ObjectMessage) message;
>  event = (ILoggingEvent) objectMessage.getObject();
>  Logger log = (Logger) LoggerFactory.getLogger(event.getLoggerName());
>  log.callAppenders(event);
> This is the only way i use Logger in the server side. I never use calls like log.debug(...) or similars
> In the server-side (MDB) I have set up a configuration with these line:
> <configuration scan="true" scanPeriod="30 seconds" > 
> File automatically reload every 30 seconds.
> The problem is that it never reloads the configuration file.
> The cause is the following.
> In the logback site we can read, about the scan attribute in the configuration file:
> "
> Behind the scenes, when you set the scan attribute to true, a TurboFilter called ReconfigureOnChangeFilter  will be installed. TurboFilters are described in a later chapter. As a consequence, scanning is done "in-thread", that is anytime a printing method of logger is invoked. 
> "
> And the fact is that Logger.callAppenders() doesn´t  check the turbofilters, and thus it never reloads the configuration file.
> Proposed solution:  (may be is not de correct one, but i think it could solve the problem):
> Modify  callAppenders(ILoggingEvent event) 
> Add the following  line at the beggining of the method:
> boolean enabled = isEnabledFor(event.getLevel());  //call indirectly turbofilters
> and besides we could use enabled to return directly (if  not enabled)
> if (!enabled) {
> return 
> }
> So the new code could be something like 
>   /**
>    * Invoke all the appenders of this logger.
>    * 
>    * @param event
>    *                The event to log
>    */
>   public void callAppenders(ILoggingEvent event) {
>     boolean enabled = isEnabledFor(event.getLevel()); 
>     if (!enabled) {
>      return  ;
>      }
>     int writes = 0;
>     for (Logger l = this; l != null; l = l.parent) {
>       writes += l.appendLoopOnAppenders(event);
>       if (!l.additive) {
>         break;
>       }
>     }
>     // No appenders in hierarchy
>     if (writes == 0) {
>       loggerContext.noAppenderDefinedWarning(this);
>     }
>   }
> Thanks

This message is automatically generated by JIRA.
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the logback-dev mailing list