You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by Steve Hunter <sh...@xcellnet.net> on 2002/12/18 20:46:21 UTC

FallbackErrorHandler

Hi -

Trying (failing) to get a FallbackAppender to work as advertised.  Our IT
insists on keeping our log files on a share drive (Win2K), which of course
they can't guarantee will always be up (yeah... Win2K).  If L4J tries to
write to the share drive when the machine is mysteriously offline, it throws
up, removes the appender, and then we're not logging anymore.  Insurance
companies _hate_ that.

Seems like a fallback appander would be an easy answer - if the network
drive goes down, start logging to a local drive.  I think I have everything
configured correctly (judging from the startup msgs), but the fallback
appender chokes as well.  I wrote a small test program which prints a
message, waits 10 seconds, then prints another message.  I have a primary
FileAppender which writes to a mapped drive, the fallback writes to a local
drive.  Config file is at the end.  Here's my reward:

log4j: Threshold ="null".
log4j: Level value for root is  [DEBUG].
log4j: root level set to DEBUG
log4j: Class name: [org.apache.log4j.FileAppender]
log4j: FB: Setting primary appender to [FILE].
log4j: Class name: [org.apache.log4j.FileAppender]
log4j: Setting property [file] to
[C:\ea\components\core\test\class\fallback.out].
log4j: Setting property [append] to [false].
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [fb: %-5p %d [%t] %C{2} -
%m%n].
log4j: setFile called: C:\ea\components\core\test\class\fallback.out, false
log4j: setFile ended
log4j: FB: Setting backup appender to [FILE-fallback].
log4j: Setting property [file] to [Z:\primary.out].
log4j: Setting property [append] to [false].
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [%-5p %d [%t] %C{2} - %m%n].
log4j: setFile called: Z:\primary.out, false
log4j: setFile ended
log4j: Adding appender named [FILE] to category [root].
log4j: Sleeping for 10 seconds:
..........
log4j: FB: The following error reported: Failed to flush writer,
java.io.IOException: Reached end of file
	at java.io.FileOutputStream.writeBytes(Native Method)
	at java.io.FileOutputStream.write(FileOutputStream.java:207)
	at
java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:225)
	at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:239)
	at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:49)
	at
org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:306)
	at org.apache.log4j.WriterAppender.append(WriterAppender.java:150)
	at
org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:221)
	at
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(Append
erAttachableImpl.java:57)
	at org.apache.log4j.Category.callAppenders(Category.java:187)
	at org.apache.log4j.Category.forcedLog(Category.java:372)
	at org.apache.log4j.Category.warn(Category.java:1019)
	at Fallback.main(Fallback.java:43)
log4j: FB: INITIATING FALLBACK PROCEDURE.
java.lang.NullPointerException
	at
org.apache.log4j.varia.FallbackErrorHandler.error(FallbackErrorHandler.java:
79)
	at
org.apache.log4j.varia.FallbackErrorHandler.error(FallbackErrorHandler.java:
68)
	at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:51)
	at
org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:306)
	at org.apache.log4j.WriterAppender.append(WriterAppender.java:150)
	at
org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:221)
	at
org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(Append
erAttachableImpl.java:57)
	at org.apache.log4j.Category.callAppenders(Category.java:187)
	at org.apache.log4j.Category.forcedLog(Category.java:372)
	at org.apache.log4j.Category.warn(Category.java:1019)
	at Fallback.main(Fallback.java:43)
Exception in thread "main" 

__________________

and, here's my config file:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'
debug="true">
    <appender name="FILE" class="org.apache.log4j.FileAppender">
           <errorHandler
class="org.apache.log4j.varia.FallbackErrorHandler">
             <appender-ref ref="FILE-fallback" />
           </errorHandler>
           <param name="File" value="Z:\\primary.out" />
           <param name="Append" value="false"/>
           <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%-5p %d [%t] %C{2} -
%m%n"/>
           </layout>
    </appender>

    <appender name="FILE-fallback" class="org.apache.log4j.FileAppender">
           <param name="File"
value="C:\\ea\\components\\core\\test\\class\\fallback.out" />
           <param name="Append" value="false"/>
           <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="fb: %-5p %d [%t] %C{2} -
%m%n"/>
           </layout>
    </appender>

    <root>
       <priority value="DEBUG" />
       <appender-ref ref="FILE" />
    </root>
</log4j:configuration>

__________________

It _does_ initially create a zero-length fallback.out file, but then has an
IO exception when it tries to write to it.  Did I do something horribly
wrong?  Any help is appreciated.

Thanks - 
 --Steve

Re: FallbackErrorHandler

Posted by Ceki Gülcü <ce...@qos.ch>.
You are missing a <root-ref> element. For an explanation see attached
excerpt from the complete log4j manual.

By the way, FallbackErrorHandler should have dealt with the situation
a bit more gracefully but since you have not added a reference to the
root logger it barfs. You may wish to submit a bug report although
adding the <root-ref> element will fix the current problem.

At 13:46 18.12.2002 -0600, you wrote:
>Hi -
>
>Trying (failing) to get a FallbackAppender to work as advertised.  Our IT
>insists on keeping our log files on a share drive (Win2K), which of course
>they can't guarantee will always be up (yeah... Win2K).  If L4J tries to
>write to the share drive when the machine is mysteriously offline, it throws
>up, removes the appender, and then we're not logging anymore.  Insurance
>companies _hate_ that.
>
>Seems like a fallback appander would be an easy answer - if the network
>drive goes down, start logging to a local drive.  I think I have everything
>configured correctly (judging from the startup msgs), but the fallback
>appender chokes as well.  I wrote a small test program which prints a
>message, waits 10 seconds, then prints another message.  I have a primary
>FileAppender which writes to a mapped drive, the fallback writes to a local
>drive.  Config file is at the end.  Here's my reward:
>
>log4j: Threshold ="null".
>log4j: Level value for root is  [DEBUG].
>log4j: root level set to DEBUG
>log4j: Class name: [org.apache.log4j.FileAppender]
>log4j: FB: Setting primary appender to [FILE].
>log4j: Class name: [org.apache.log4j.FileAppender]
>log4j: Setting property [file] to
>[C:\ea\components\core\test\class\fallback.out].
>log4j: Setting property [append] to [false].
>log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
>log4j: Setting property [conversionPattern] to [fb: %-5p %d [%t] %C{2} -
>%m%n].
>log4j: setFile called: C:\ea\components\core\test\class\fallback.out, false
>log4j: setFile ended
>log4j: FB: Setting backup appender to [FILE-fallback].
>log4j: Setting property [file] to [Z:\primary.out].
>log4j: Setting property [append] to [false].
>log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
>log4j: Setting property [conversionPattern] to [%-5p %d [%t] %C{2} - %m%n].
>log4j: setFile called: Z:\primary.out, false
>log4j: setFile ended
>log4j: Adding appender named [FILE] to category [root].
>log4j: Sleeping for 10 seconds:
>..........
>log4j: FB: The following error reported: Failed to flush writer,
>java.io.IOException: Reached end of file
>         at java.io.FileOutputStream.writeBytes(Native Method)
>         at java.io.FileOutputStream.write(FileOutputStream.java:207)
>         at
>java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:225)
>         at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:239)
>         at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:49)
>         at
>org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:306)
>         at org.apache.log4j.WriterAppender.append(WriterAppender.java:150)
>         at
>org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:221)
>         at
>org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(Append
>erAttachableImpl.java:57)
>         at org.apache.log4j.Category.callAppenders(Category.java:187)
>         at org.apache.log4j.Category.forcedLog(Category.java:372)
>         at org.apache.log4j.Category.warn(Category.java:1019)
>         at Fallback.main(Fallback.java:43)
>log4j: FB: INITIATING FALLBACK PROCEDURE.
>java.lang.NullPointerException
>         at
>org.apache.log4j.varia.FallbackErrorHandler.error(FallbackErrorHandler.java:
>79)
>         at
>org.apache.log4j.varia.FallbackErrorHandler.error(FallbackErrorHandler.java:
>68)
>         at org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:51)
>         at
>org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:306)
>         at org.apache.log4j.WriterAppender.append(WriterAppender.java:150)
>         at
>org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:221)
>         at
>org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(Append
>erAttachableImpl.java:57)
>         at org.apache.log4j.Category.callAppenders(Category.java:187)
>         at org.apache.log4j.Category.forcedLog(Category.java:372)
>         at org.apache.log4j.Category.warn(Category.java:1019)
>         at Fallback.main(Fallback.java:43)
>Exception in thread "main"
>
>__________________
>
>and, here's my config file:
>
><?xml version="1.0" encoding="UTF-8" ?>
><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
><log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'
>debug="true">
>     <appender name="FILE" class="org.apache.log4j.FileAppender">
>            <errorHandler
>class="org.apache.log4j.varia.FallbackErrorHandler">
>              <appender-ref ref="FILE-fallback" />
>            </errorHandler>
>            <param name="File" value="Z:\\primary.out" />
>            <param name="Append" value="false"/>
>            <layout class="org.apache.log4j.PatternLayout">
>              <param name="ConversionPattern" value="%-5p %d [%t] %C{2} -
>%m%n"/>
>            </layout>
>     </appender>
>
>     <appender name="FILE-fallback" class="org.apache.log4j.FileAppender">
>            <param name="File"
>value="C:\\ea\\components\\core\\test\\class\\fallback.out" />
>            <param name="Append" value="false"/>
>            <layout class="org.apache.log4j.PatternLayout">
>              <param name="ConversionPattern" value="fb: %-5p %d [%t] %C{2} -
>%m%n"/>
>            </layout>
>     </appender>
>
>     <root>
>        <priority value="DEBUG" />
>        <appender-ref ref="FILE" />
>     </root>
></log4j:configuration>
>
>__________________
>
>It _does_ initially create a zero-length fallback.out file, but then has an
>IO exception when it tries to write to it.  Did I do something horribly
>wrong?  Any help is appreciated.
>
>Thanks -
>  --Steve

--
Ceki