2012-11-08 15 views
8

La funzionalità di cui ho bisogno è scrittura di una riga di intestazione all'inizio del file di registro configurato. Il file di registro dovrebbe, inoltre, essere laminato su in base a un modello temporale (sto parlando di logback 1.0.7).Appender di logback personalizzato - Preliminare l'intestazione del file e renderlo rollover

Quindi, sto pensando di scrivere un Appender - anche se non sono sicuro se non è una consuetudine layout che ho effettivamente bisogno.

1) Appender

Per la documentazione del logback, il giusto approccio è quello di estendere AppenderSkeleton, ma poi come faccio a combinare questo con l'RollingFileAppender (per rendere il file rollover?)

D'altra mano, se estendo RollingFileAppender, quale metodo devo sovrascrivere per decorare semplicemente la funzionalità esistente? Come posso dire di scrivere quella stringa particolare solo all'inizio del file?

2) Disposizione

Analogamente, l'approccio sembra essere estendere LayoutBase, e fornendo un'implementazione doLayout(ILoggingEvent event). Ma ancora una volta, non so come decorare semplicemente il comportamento - basta aggiungere una nuova riga nel file, piuttosto che interrompere la sua funzionalità (perché voglio ancora che il resto dei log compaia correttamente).

Il in LayoutBase sembra promettente, ma come si usa? È anche destinato a essere sovrascritto dai layout personalizzati? (probabilmente sì, dal momento che fa parte dell'interfaccia Layout, ma come?)

Grazie!

risposta

10

Qui rispondo alla mia domanda, nel caso in cui qualcun altro incontri lo stesso problema. è così che alla fine lo ha fatto (non so se è il modo ortodosso):

Invece di estendere AppenderSkeleton, ho esteso RollingFileAppender (per mantenere la funzionalità di rollover) e calpestato il suo metodo OpenFile(). Qui potrei manipolare il file di log e scrivere l'intestazione al suo interno, dopo avergli fatto fare tutto quello che dovevo fare di default. Come questo:

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

ho configurato l'intestazione in logback.xml, semplice come questo: <header> value </header>. Questo lo inietta nel campo di intestazione del mio nuovo appender.

Sembra funzionare senza problemi, ma si prega di postare se si conosce un modo migliore!

+0

@teo sai come possiamo ottenere proprietà personalizzata definita in logback.xml nel metodo start di qualsiasi classe Appender personalizzato? – Mihir

4

La soluzione ha un problema: elimina la prima riga del registro di ogni nuovo file. Penso che questo sia perché scrivi l'intestazione mentre il file è aperto da logback. ho trovato un'altra soluzione che non ha questo problema:

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