2012-11-08 19 views
8

Die Funktionalität, die ich brauche ist Schreiben einer Kopfzeile am Anfang der konfigurierten Protokolldatei. Die Protokolldatei sollte zusätzlich über basierend auf einem Zeitmuster (ich spreche Logback 1.0.7) gerollt werden.Benutzerdefinierte Logback Appender - Voranstellen Datei Header und es Rollover

Also, ich denke, ein Appender schreiben - obwohl ich nicht sicher bin, ob es nicht ein benutzerdefinierte -Layout ist, die mich wirklich brauchen.

1) Appender

Per logback in der Dokumentation, der richtige Ansatz ist AppenderSkeleton, zu verlängern, aber dann, wie würde ich kombinieren dies mit dem RollingFileAppender (um die Datei zu Roll machen?)

Auf der anderen Hand, wenn ich erweitern RollingFileAppender, welche Methode überschreibe ich, um nur die vorhandene Funktionalität zu dekorieren? Wie sage ich, dass diese bestimmte Zeichenfolge nur am Anfang der Datei geschrieben wird?

2) Layout-

Analog scheint der Ansatz LayoutBase zu erstrecken, und eine Implementierung für doLayout(ILoggingEvent event) bereitstellt. Aber wieder, ich weiß nicht, wie man das Verhalten nur schmücken - nur eine neue Zeile in der Datei hinzufügen, anstatt die Funktionalität zu stören (weil ich immer noch möchte, dass der Rest der Protokolle ordnungsgemäß angezeigt wird). Die getFileHeader() in LayoutBase sieht vielversprechend aus, aber wie benutze ich sie? Soll es sogar von benutzerdefinierten Layouts überschrieben werden? (wahrscheinlich ja, da es Teil der Layout-Oberfläche ist, aber dann wie?)

Vielen Dank!

Antwort

10

Hier beantworte ich meine eigene Frage, nur für den Fall, dass jemand anderes auf dasselbe Problem stößt. Dies ist, wie ich habe es schließlich (nicht jedoch wissen, ob es die orthodoxe Weise ist):

Statt AppenderSkeleton verlängern, verlängert ich RollingFileAppender (die Rollover-Funktionalität zu halten) und overrode seine openfile() -Methode. Hier könnte ich die Log-Datei manipulieren und den Header darin schreiben, nachdem ich alles getan habe, was es standardmäßig tun musste. Wie folgt aus:

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

konfiguriert ich den Header in logback.xml, so einfach wie diese: <header> value </header>. Dies spritzt es in das Header-Feld meines neuen Appenders.

Scheint ohne Probleme zu funktionieren, aber bitte posten Sie, wenn Sie einen besseren Weg kennen!

+0

@teo wissen Sie, wie können wir benutzerdefinierte Eigenschaft in logback.xml in Startmethode jeder benutzerdefinierten Appender Klasse definiert werden? – Mihir

4

Ihre Lösung hat ein Problem: Sie löscht die erste Zeile des Protokolls jeder neuen Datei. Ich denke, das liegt daran, dass Sie den Header schreiben, während die Datei per Logback geöffnet ist. Ich habe eine andere Lösung gefunden, die dieses Problem nicht haben:

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