You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-user@logging.apache.org by "J.T. Conklin" <jt...@acorntoolworks.com> on 2008/04/14 19:26:04 UTC

should log4cxx protect itself from exceptions thrown by appenders?

Hi,

When an appender's doAppend method throws an exception, it unwinds
through the call stack.  At the very least, this means that the log
message won't be passed to any other appenders that might otherwise
process it.  It seems to me that log4cxx needs to protect calls to
doAppend with a try/catch(...) block that squelches the errant
exception.  

In my case, the exception escaped all the way up to a ->log() call
from one of my destructors, which caused bad things to happen...

    --jtc

-- 
J.T. Conklin

Re: should log4cxx protect itself from exceptions thrown by appenders?

Posted by Curt Arnold <ca...@apache.org>.
On Apr 14, 2008, at 12:26 PM, J.T. Conklin wrote:

> Hi,
>
> When an appender's doAppend method throws an exception, it unwinds
> through the call stack.  At the very least, this means that the log
> message won't be passed to any other appenders that might otherwise
> process it.  It seems to me that log4cxx needs to protect calls to
> doAppend with a try/catch(...) block that squelches the errant
> exception.
>
> In my case, the exception escaped all the way up to a ->log() call
> from one of my destructors, which caused bad things to happen...
>
>    --jtc
>
> --  
> J.T. Conklin

I don't have time to explore at the moment (the US government has me  
on its annual April 15th deadline), however it is likely that you are  
seeing a design that is directly carried over from log4j.  In general,  
log4cxx tries to maintain a very similar design to log4j, so if log4j  
doesn't have a try/catch block, then log4cxx would not.  If there is  
not a try/catch block in log4j, then the "contract" with the appender  
is that it not throw an exception from its doAppend block.  It would  
be good to know which of the following category your problem falls into:

1. You are using a custom appender that throws an exception.  The  
log4cxx dispatching code does not catch the exception.  The log4j and  
log4cxx dispatching logics are consistent.  Resolution: catch the  
exception within your appender.

2. You are using a log4cxx provided appender that throws an exception  
where the log4j equivalent does not.  The log4cxx dispatch code does  
not catch the exception.  The log4j and log4cxx dispatching logics are  
consistent.   Resolution: Fix the log4cxx appender.

3. You are using a log4cxx provided appender that throws an exception  
as does the log4j equivalent.  The log4cxx dispatch code does not  
catch the exception, but the log4j dispatch code would.  Resolution:  
Fix the log4cxx dispatch code.

4. You are using a log4cxx provided appender that throws an exception  
as does the log4j equivalent.  Neither log4cxx and log4j catch the  
exception.  Resolution: Find a resolution to the problem for log4j and  
then port to log4cxx.