2013-10-02 13 views
7

Come si configura log4j.properties di avere esattamente un file di log per ogni corsa di un app. Ho letto che dovresti usare un timestamp nel nome del file ma che creerà molti file per esecuzione col passare del tempo.Un file di log per ogni corsa con log4j

ho cercato DailyRollingFileAppender e RollingFileAppender, ma non riesce a trovare un modo per configurare exctly un log per ogni corsa. Il log non dovrebbe essere suddiviso in più log e non dovrebbe essere troncato e i file di vecchie esecuzioni dovrebbero essere preservati.

ogni classe ha un'org.slf4j.Logger statico per il proprio nome di classe:

private static final Logger log = LoggerFactory.getLogger(Foo.class); 

Questo è il mio attuale log4j.properties

log4j.rootLogger=error, RootAppender, RootErrorAppender 

#log4j.logger.com.example=info, qspaBackendAppender, stderr 
log4j.logger.com.example=info, qspaBackendAppender 
log4j.additivity.com.example=true 

#log4j.logger.com.example.util=trace, qspaBackendAppender, stderr 
#log4j.additivity.com.example.util=true 

log4j.appender.qspaBackendAppender=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.qspaBackendAppender.file=logs/qspaBackend.log 
log4j.appender.qspaBackendAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.qspaBackendAppender.layout.ConversionPattern=<%d{yyyy-MM-dd HH:mm:ss}> %-5p : %C{1} %c{2} : %m%n 

log4j.appender.stderr=org.apache.log4j.ConsoleAppender 
log4j.appender.stderr.Target=System.err 
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout 
log4j.appender.stderr.layout.ConversionPattern=%-5p %c{1}:%L - %m%n 

log4j.appender.RootAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.RootAppender.file=logs/root.log 
log4j.appender.RootAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.RootAppender.layout.ConversionPattern=<%d{yyyy-MM-dd HH:mm:ss}> %-5p : %C{1} %c{2} : %m%n 

log4j.appender.RootErrorAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.RootErrorAppender.file=logs/rootError.log 
log4j.appender.RootErrorAppender.layout=org.apache.log4j.PatternLayout 
log4j.appender.RootErrorAppender.layout.ConversionPattern=<%d{yyyy-MM-dd HH:mm:ss}> %-5p : %C{1} %c{2} : %m%n 
log4j.appender.RootErrorAppender.threshold=error 

risposta

2

Unire la risposta del Udo Klimaschewski e la risposta da questo question per ottenere il risultato desiderato.

  1. aggiungere l'append proprietà = false
  2. aggiungere una proprietà di sistema current.time e utilizzarlo nel nome del file
+0

Perfetto! Esattamente quello che stavo cercando e molto più semplice di un FileAppender personalizzato come questo: http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time- the-application-runs/Ma probabilmente non è sicuro per le esecuzioni concorrenti, ma questo non è un problema per me – lilalinux

+2

'La risposta di Udo Klimaschewski' -> stai solo collegando al profilo utente. Non sappiamo a cosa ti riferisci. –

10

ho avuto problemi recupero che di Udo Klimaschewski risposta Udy si riferiva così ho messo qui la mia soluzione. log4j.properties:

# Root logger option 
log4j.rootLogger=INFO, fileout 

# Direct log messages to file 
log4j.appender.fileout=org.apache.log4j.FileAppender 
log4j.appender.fileout.File=/logs/myapp_${current.date}.log 
log4j.appender.fileout.ImmediateFlush=true 
log4j.appender.fileout.Threshold=debug 
log4j.appender.fileout.Append=false 
log4j.appender.fileout.layout=org.apache.log4j.PatternLayout 
log4j.appender.fileout.layout.conversionPattern=%5p | %d | %m%n 

poi mettere nella classe principale di questo blocco:

public class Starter { 
    static{ 
     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hhmmss"); 
     System.setProperty("current.date", dateFormat.format(new Date())); 
    } 
Problemi correlati