I had sent this
email to user list.
It probably belongs
here.
I am having problem using AsyncAppender with the
FallbackErrorHandler.
I have
a) a AsyncAppender attached to the root logger.
b) a JMSAppender attached to the AsyncAppender.
c) a FallbackErrorHandler attached to the JMSAppender. The FallbackErrorHandler specifies the root as a logger (using root-ref tag) and a FileAppender as the fallback appender (using appender-ref tag).
a) a AsyncAppender attached to the root logger.
b) a JMSAppender attached to the AsyncAppender.
c) a FallbackErrorHandler attached to the JMSAppender. The FallbackErrorHandler specifies the root as a logger (using root-ref tag) and a FileAppender as the fallback appender (using appender-ref tag).
Now when an error occurs, the the
FallbackErrorHandler tries to replace the JMSAppender with the FileAppender in
the root logger! (rather than in the
AsyncAppender).
Unfortunately this does not help, as the root logger keeps sending messages to the AsyncAppender which then forwards them to the failing JMSAppender.
Unfortunately this does not help, as the root logger keeps sending messages to the AsyncAppender which then forwards them to the failing JMSAppender.
Is this a bug or am I doing something
wrong?
If this is a bug then ,I think, the
FallbackErrorHandler should be modified to check each of the loggers, specified
to it , to see if any of them have a AsyncAppender attached.
If it finds one then it should try to switch the primary and backup appender in that AsyncAppender rather than in the logger.
If it finds one then it should try to switch the primary and backup appender in that AsyncAppender rather than in the logger.
I got around my issue by modifying the
FallbackErrorHandler to do just that.
Could somebody look at the new code and let me know if this was really required and if yes then if the changes I made are appropriate
Attached is the new code.
Could somebody look at the new code and let me know if this was really required and if yes then if the changes I made are appropriate
Attached is the new code.
I added a new method called "private void
removeFromAsync(Logger l)" and modified the
"public void error(String message, Exception e, int errorCode, LoggingEvent event)" to call this new method for each logger.
"public void error(String message, Exception e, int errorCode, LoggingEvent event)" to call this new method for each logger.
Thanks fro any help.
Sat
Sat
Here is just the
modified code
==============================================
/**
Prints the message and the stack trace of the exception on
<code>System.err</code>.
*/
public
void error(String message, Exception e, int errorCode, LoggingEvent event) {
LogLog.debug("FB: The following error reported: " + message, e);
LogLog.debug("FB: INITIATING FALLBACK PROCEDURE.");
if (loggers != null) {
for(int i = 0; i < loggers.size(); i++) {
Logger l = (Logger) loggers.elementAt(i);
LogLog.debug("FB: Searching for ["+primary.getName()+"] in logger ["
+l.getName() + "].");
LogLog.debug("FB: Replacing ["+primary.getName()+"] by ["
+ backup.getName() + "] in logger ["+ l.getName() +"].");
l.removeAppender(primary);
LogLog.debug("FB: Adding appender ["+backup.getName()+"] to logger "
+ l.getName());
l.addAppender(backup);
LogLog.debug("FB: Removing from Async now");
Prints the message and the stack trace of the exception on
<code>System.err</code>.
*/
public
void error(String message, Exception e, int errorCode, LoggingEvent event) {
LogLog.debug("FB: The following error reported: " + message, e);
LogLog.debug("FB: INITIATING FALLBACK PROCEDURE.");
if (loggers != null) {
for(int i = 0; i < loggers.size(); i++) {
Logger l = (Logger) loggers.elementAt(i);
LogLog.debug("FB: Searching for ["+primary.getName()+"] in logger ["
+l.getName() + "].");
LogLog.debug("FB: Replacing ["+primary.getName()+"] by ["
+ backup.getName() + "] in logger ["+ l.getName() +"].");
l.removeAppender(primary);
LogLog.debug("FB: Adding appender ["+backup.getName()+"] to logger "
+ l.getName());
l.addAppender(backup);
LogLog.debug("FB: Removing from Async now");
removeFromAsync(l);
}
}
}
}
}
}
/**
Check each appender in the logger to see if it is a AsyncAdapter.
If yes then switch primary and backup appender.
*/
Check each appender in the logger to see if it is a AsyncAdapter.
If yes then switch primary and backup appender.
*/
private void
removeFromAsync(Logger l){
Enumeration appenders = l.getAllAppenders();
Appender appdr;
AsyncAppender aa;
while (appenders.hasMoreElements()){
appdr = (Appender) appenders.nextElement();
if (appdr instanceof AsyncAppender){
LogLog.debug("FB: Checking Async appender [" + appdr.getName() +"].");
aa = (AsyncAppender) appdr;
if (aa.getAppender(primary.getName()) != null){
LogLog.debug("FB: Replacing ["+primary.getName()+"] by ["
+ backup.getName() + "] in Aync Appender ["+ appdr.getName() +"].");
aa.removeAppender(primary);
aa.addAppender(backup);
}
}
}
}
Enumeration appenders = l.getAllAppenders();
Appender appdr;
AsyncAppender aa;
while (appenders.hasMoreElements()){
appdr = (Appender) appenders.nextElement();
if (appdr instanceof AsyncAppender){
LogLog.debug("FB: Checking Async appender [" + appdr.getName() +"].");
aa = (AsyncAppender) appdr;
if (aa.getAppender(primary.getName()) != null){
LogLog.debug("FB: Replacing ["+primary.getName()+"] by ["
+ backup.getName() + "] in Aync Appender ["+ appdr.getName() +"].");
aa.removeAppender(primary);
aa.addAppender(backup);
}
}
}
}
========================================================
