2010-10-13 13 views
6

J'écris actuellement un enregistreur en utilisant log4j. Une fois que j'ai chargé dans un fichier log4j.properties ou un fichier log4j.xml, je me demandais s'il y avait un moyen de détecter si le fichier de configuration de l'enregistreur est valide. Si ce n'est pas valide, j'espérais charger un paramètre par défaut (situé dans un autre fichier) à la place.log4j détection d'erreur de fichier de configuration

Merci

+1

Oui, cela est emmerdant, Je suis d'accord. Je ne pense pas que tu puisses faire ça, cependant. – skaffman

+0

J'ai fait un peu de googling et rien ne s'est passé. J'espérais que le débordement de pile pourrait me donner une réponse mais je devrais juste compter sur la bonne entrée d'utilisateur si elles décident de changer le dossier. Merci pour votre réponse! :) – user459811

Répondre

1

Vous ne pouvez essayer de vérifier manuellement un enregistreur étant inexistante ou non.

http://svn.apache.org/viewvc/logging/log4j/trunk/src/main/java/org/apache/log4j/LogManager.java?view=markup

comme: LogManager.exists ("nom de votre enregistreur");

De plus, vous pouvez vérifier si votre fichier XML est valide ou non en le validant par rapport à la DTD.

Mais quelle est la définition d'un fichier journal "valide"? Si sa seule syntaxe est basée, utilisez la validation DTD et vérifiez si le fichier de propriétés est dans un bon format.

Si un fichier est valide s'il a une constellation spécifique, utilisez l'approche manuelle ci-dessus.

Espoir qui aide, Christian

2

Nous avons résolu ce problème en redirigeant System.err avant de charger la configuration et vérifier si des erreurs ont été enregistrées dans le flux:

class ConfigurationLoader { 
    class Log4jConfigStderrStream extends ByteArrayOutputStream { 
     private int lineCount; 

     private StringBuilder output; 

     private PrintStream underlying; 

     public Log4jConfigStderrStream(PrintStream underlying) { 
      this.lineCount = 0; 
      this.output = new StringBuilder(""); 
      this.underlying = underlying; 
     } 

     @Override 
     public void flush() throws IOException { 
      String[] buffer; 
      synchronized (this) { 
       buffer = this.toString().split("\n"); 
       super.flush(); 
       super.reset(); 
       for (int i = 0; i < buffer.length; i++) { 
        String line = buffer[i].replace("\n", "").replace("\r", 
          ""); 
        if (line.length() > 0) { 
         this.lineCount++; 
         this.output.append(line); 
         this.output.append("\n"); 
        } 
       } 
      } 
     } 

     public String getOutput() { 
      return this.output.toString(); 
     } 

     public PrintStream getUnderlying() { 
      return this.underlying; 
     } 

     public boolean hasErrors() { 
      return this.lineCount == 0 ? false : true; 
     } 
    } 

    private String output; 

    public void flushOutput() { 
     if (!"".equals(this.output)) 
      System.err.print(this.output); 
    } 

    public boolean loadConfiguration(String filename) { 
     Log4jConfigStderrStream confErr; 
     confErr = new Log4jConfigStderrStream(System.err); 
     System.setErr(new PrintStream(confErr, true)); 
     LogManager.resetConfiguration(); 
     DOMConfigurator.configure(filename); 
     System.setErr(confErr.getUnderlying()); 
     this.output = confErr.getOutput(); 
     return !confErr.hasErrors(); 
    } 
} 
Questions connexes