2010-10-13 4 views
6

В настоящее время я пишу регистратор, использующий log4j. Как только я загружаю файл log4j.properties или файл log4j.xml, мне было интересно, существует ли способ определить, действителен ли файл конфигурации журнала. Если он недействителен, я надеялся загрузить параметр по умолчанию (который находится в другом файле).log4j ошибка определения файла конфигурации

Благодаря

+1

Да, это чертовски раздражает, Согласен. Я не думаю, что вы можете это сделать. – skaffman

+0

Я немного поработал над поисковой системой, и ничего не получилось. Я надеялся, что переполнение стека может дать мне ответ, но я предполагаю, что мне просто придется положиться на хороший пользовательский ввод, если они решат изменить файл. Спасибо за ваш ответ! :) – user459811

ответ

1

Вы можете только попытаться проверить вручную лесорубом быть существует или нет.

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

Как: LogManager.exists ("ваше имя регистратор");

Кроме того, вы можете проверить, действительно ли ваш xml действителен или нет, с его проверкой против DTD.

Но каково определение для «действительного» файла журнала? Если в его единственном синтаксисе используется проверка DTD и проверьте, находится ли файл свойств в хорошем формате.

Если файл действителен, если у него есть определенное созвездие, используйте ручной подход выше.

Надежда, что помогает, Christian

2

Мы решили эту проблему путем перенаправления System.err перед загрузкой конфигурации и проверки, если ошибки были зарегистрированы в поток:

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(); 
    } 
} 
Смежные вопросы