2010-10-13 35 views
6

Tôi hiện đang viết một trình ghi nhật ký sử dụng log4j. Một khi tôi tải trong một log4j.properties hoặc một tập tin log4j.xml, tôi đã tự hỏi nếu có một cách để phát hiện nếu tập tin cấu hình logger là hợp lệ. Nếu nó không hợp lệ, tôi hy vọng sẽ tải một thiết lập mặc định (được đặt trong một tệp khác).phát hiện lỗi tập tin cấu hình log4j

Cảm ơn

+1

Vâng, đây là nguyền rủa gây phiền nhiễu, Tôi đồng ý. Tôi không nghĩ rằng bạn có thể làm điều này, mặc dù. – skaffman

+0

Tôi đã làm một chút googling và không có gì bật lên. Tôi đã hy vọng tràn ngăn xếp có thể cho tôi một câu trả lời nhưng tôi đoán tôi sẽ chỉ phải dựa vào đầu vào người dùng tốt nếu họ quyết định thay đổi tập tin. Cám ơn phản hồi của bạn! :) – user459811

Trả lời

1

Bạn chỉ có thể cố gắng kiểm tra bằng tay cho một logger là tồn tại hay không.

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

Giống như: LogManager.exists ("tên logger của bạn");

Ngoài ra, bạn có thể kiểm tra xem xml của mình có hợp lệ hay không với xác thực hợp lệ đối với DTD.

Nhưng định nghĩa cho tệp nhật ký "hợp lệ" là gì? Nếu cú ​​pháp duy nhất của nó dựa trên việc sử dụng xác thực DTD và kiểm tra xem tệp thuộc tính có ở định dạng tốt hay không.

Nếu tệp hợp lệ nếu tệp có chòm sao cụ thể, hãy sử dụng phương pháp thủ công ở trên.

Hy vọng rằng sẽ giúp, Christian

2

Chúng tôi giải quyết vấn đề này bằng cách chuyển hướng System.err trước khi tải cấu hình và kiểm tra nếu lỗi được đăng nhập vào dòng:

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(); 
    } 
} 
Các vấn đề liên quan