2012-11-08 9 views
8

Chức năng mà tôi cần là viết dòng tiêu đề ở đầu tệp nhật ký được định cấu hình. Tệp nhật ký nên, ngoài ra, được cuộn qua dựa trên mẫu thời gian (tôi đang nói về logback 1.0.7).Tùy chỉnh Logback Appender - Chuẩn bị tập tin header và làm cho nó rollover

Vì vậy, tôi đang nghĩ đến việc viết một appender - mặc dù tôi không chắc chắn cho dù đó không phải là một tùy chỉnh Layout mà tôi thực sự cần.

1) appender

mỗi tài liệu logback của, cách tiếp cận đúng là mở rộng AppenderSkeleton, nhưng sau đó làm thế nào tôi sẽ kết hợp này với RollingFileAppender (để làm cho các tập tin rollover?)

Mặt khác Nếu tôi mở rộng RollingFileAppender, tôi sẽ ghi đè phương thức nào để chỉ trang trí chức năng hiện có? Làm thế nào để tôi nói với nó để viết rằng chuỗi cụ thể chỉ ở đầu của tập tin?

2) Giao diện

Tương tự, phương pháp này dường như được mở rộng LayoutBase, và cung cấp một thực hiện cho doLayout(ILoggingEvent event). Nhưng một lần nữa, tôi không biết cách trang trí hành vi - chỉ cần thêm một dòng mới vào tệp, thay vì làm gián đoạn chức năng của nó (vì tôi vẫn muốn phần còn lại của nhật ký hiển thị đúng).

getFileHeader() trong LayoutBase có vẻ đầy hứa hẹn, nhưng làm cách nào để sử dụng? Nó thậm chí có ý định bị ghi đè bởi bố cục tùy chỉnh không? (có thể có, vì đó là một phần của giao diện Bố cục, nhưng sau đó làm cách nào?)

Cảm ơn bạn!

Trả lời

10

Ở đây tôi trả lời câu hỏi của riêng tôi, chỉ trong trường hợp người khác gặp phải vấn đề tương tự. Đây là cách cuối cùng tôi đã làm (không biết tuy nhiên nếu đó là cách chính thống):

Thay vì mở rộng AppenderSkeleton, tôi đã mở rộng RollingFileAppender (để giữ chức năng di chuột qua) và overrode phương thức openFile() của nó. Ở đây tôi có thể thao tác tệp nhật ký và viết tiêu đề trong đó, sau khi cho phép nó làm bất cứ điều gì cần thiết để làm theo mặc định. Như thế này:

public void openFile(String fileName) throws IOException { 
     super.openFile(fileName); 
     File activeFile = new File(getFile()); 
     if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) { 
      FileUtils.writeStringToFile(activeFile, header); 
     } 
    } 

Tôi đã định cấu hình tiêu đề trong logback.xml, đơn giản như sau: <header> value </header>. Điều này tiêm nó vào trường tiêu đề của appender mới của tôi.

Dường như làm việc không có vấn đề gì, nhưng xin vui lòng đăng bài nếu bạn biết một cách tốt hơn!

+0

@teo làm bạn biết làm thế nào chúng ta có thể được sở hữu tùy chỉnh theo quy định tại logback.xml trong phương pháp bắt đầu của bất kỳ tùy chỉnh appender lớp học? – Mihir

4

Giải pháp của bạn có vấn đề: nó xóa dòng đầu tiên của nhật ký của mỗi tệp mới. Tôi nghĩ rằng điều này là do bạn viết tiêu đề trong khi các tập tin được mở bằng logback. Tôi đã tìm thấy một giải pháp mà không có vấn đề này:

public void openFile(String fileName) throws IOException 
{ 
    super.openFile(fileName); 
    File activeFile = new File(getFile()); 
    if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) 
    { 
     lock.lock(); 
     try 
     { 
      new PrintWriter(new OutputStreamWriter(getOutputStream(), StandardCharsets.UTF_8), true).println("your header"); 
     } 
     finally 
     { 
      lock.unlock(); 
     } 
    } 
}