2009-10-01 3 views
3

Avec log4j, je voudrais revenir à un ConsoleAppender si le FileAppender a des problèmes d'écriture dans le fichier journal spécifié. Cela signifie attraper une exception FileNotFoundException ou une exception IOException et passer à un ConsoleAppender.Si FileAppender échoue, revenez à ConsoleAppender

a-t-il été fait avant ou aurai-je créer une nouvelle appender - quelque chose le long des lignes de:

private WriterAppender appender; 

public FileOrConsoleAppender(Layout layout, String filename, boolean append) { 
    try { 
     appender = new FileAppender(layout, filename, append, bufferedIO, bufferSize); 
    } 
    catch (IOException e) { 
     appender = new ConsoleAppender(layout); 
    } 
} 

MISE À JOUR - COMMENT JE L'AI FAIT:

Merci à @jsight, pour me pointer vers FallBackErrorHandler.

Voici ma log4j configuration xml qui revient à un ConsoleAppender, si FileAppender échoue:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"> 

    <!-- A Console appender --> 
    <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p %30.30c - %m%n"/> 
    </layout> 
    </appender> 

    <!-- A File appender, with fallback to Console--> 
    <appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> 
    <errorHandler class="org.apache.log4j.varia.FallbackErrorHandler"> 
     <root-ref/> 
     <appender-ref ref="console"/> 
    </errorHandler> 
    <param name="File" value="C:/temp/test.log"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p %30.30c - %m%n"/> 
    </layout> 
    </appender> 

<root> 
     <level value="INFO" /> 
     <appender-ref ref="file" /> 
</root> 

</log4j:configuration> 

Répondre

1

Vous devez créer un appender nouveau/custom, comme log4j ne sera jamais jeter une exception à votre code s'il est un problème de connexion à un appender. C'est un objectif de conception et une caractéristique de log4j.

De the log4j FAQ:

est log4j un système d'enregistrement fiable?
Le numéro log4j n'est pas fiable. C'est un système de journalisation fail-stop de meilleur effort. Par défaut-stop, nous voulons dire que log4j ne lancera pas d'exceptions inattendues au moment de l'exécution, ce qui pourrait causer le plantage de votre application. Si pour une raison quelconque, log4j renvoie une exception non interceptée, veuillez envoyer un courrier électronique à la liste de diffusion [email protected] Les exceptions non interceptées sont traitées comme des bogues sérieux nécessitant une attention immédiate.

De plus, log4j ne retournera pas à System.out ou System.err lorsque son flux de sortie désigné n'est pas ouvert, n'est pas accessible en écriture ou devient plein. Cela évite de corrompre un programme fonctionnant autrement en inondant le terminal de l'utilisateur parce que la journalisation échoue. Toutefois, log4j enverra un seul message à System.err indiquant que la journalisation ne peut pas être effectuée.

Quelles sont les fonctionnalités de log4j?
...
Le paramètre log4j est fail-stop. Cependant, bien qu'il s'efforce certainement d'assurer la livraison, log4j ne garantit pas que chaque instruction de journal sera livrée à sa destination.

Questions connexes