2012-11-08 21 views
8

İhtiyacım olan işlevsellik, yapılandırılmış günlük dosyasının başında bir üstbilgi satırı yazıyor . Günlük dosyası, ek olarak, , bir zaman düzenine bağlı olarak üzerinden aktarılmalıdır (logback 1.0.7'den bahsediyorum).Özel Logback Appender - Dosya üstbilgisini hazırlanıyor ve rollover yapılıyor

Yani, bir Appender yazma düşünüyorum - Ben aslında gerek özel Düzen olup olmaması değil eminim rağmen.

1) Appender logback belgelerine Başına

, doğru yaklaşım AppenderSkeleton uzatmak, ama sonra nasıl Diğer taraftan RollingFileAppender (dosya rollover yapılır?)

ile birleştirmek istiyorum el, RollingFileAppender'u uzatırsam, varolan işlevselliği süslemek için hangi yöntemi geçersiz kılabilirim? Bu dizgiyi sadece dosyanın başında yazmasını nasıl söylerim?

2) Düzen Benzer şekilde, bu yaklaşım LayoutBase uzanan ve doLayout(ILoggingEvent event) için bir uygulama temin gibi görünüyor. Ama yine de, yalnızca davranışı nasıl dekore edeceğimi bilmiyorum - işlevine zarar vermek yerine dosyaya yeni bir satır eklemeye devam ediyorum (çünkü geri kalanların hala düzgün şekilde görünmesini istiyorum).

LayoutBase'daki getFileHeader(), umut verici görünüyor, ancak nasıl kullanırım? Özel düzenler tarafından bile geçersiz kılınması mı gerekiyor? (muhtemelen, Layout arayüzünün bir parçası olduğu için evet, ama sonra nasıl?)

Teşekkür ederiz!

cevap

10

Burada, başka birinin aynı sorunla karşılaşması halinde kendi sorumu yanıtlıyorum. Bu Sonunda o (o ortodoks yolu ise ancak bilmiyorum) did nasıl: AppenderSkeleton uzanan yerine

, ben (rollover işlevselliğini tutmak için) RollingFileAppender uzatıldı ve bunun OpenFile() yöntemini overrode. Burada varsayılan olarak yapmak için ne gerekiyorsa onu yaptıktan sonra günlük dosyasını manipüle edebilir ve başlığını yazabilirim. Şunun gibi: <header> value </header>:

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); 
     } 
    } 

Ben bu kadar basit, logback.xml üstbilgi yapılandırılmış. Bu yeni ekleyicimin başlık alanına enjekte eder.

Sorun yaşamadan çalışır, ancak daha iyi bir yol biliyorsanız lütfen mesaj gönderin!

+0

@teo biz özel özellik herhangi bir özel Appender sınıfın başlangıç ​​yönteminde logback.xml tanımlanan alabilirsiniz biliyor musunuz? – Mihir

4

Çözümünüzün bir sorunu var: her yeni dosyanın günlük ilk satırını siler. Sanırım bunun nedeni, başlığı yazarken, dosyanın açık olması. Bu sorunu yok başka çözüm bulduk:

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(); 
     } 
    } 
}