2013-10-02 4 views
7

Wie konfigurieren Sie log4j.properties, um genau eine Logdatei pro Lauf einer App zu haben. Ich habe gelesen, dass Sie einen Timestamp im Dateinamen verwenden sollten, aber das wird viele Dateien pro Lauf im Laufe der Zeit erstellen.Ein Logfile pro Lauf mit log4j

Ich habe versucht DailyRollingFileAppender und RollingFileAppender, aber kann keine Möglichkeit finden, genau ein Protokoll pro Lauf zu konfigurieren. Das Protokoll sollte nicht in mehrere Protokolle aufgeteilt werden und es sollte nicht abgeschnitten werden, und Dateien von alten Läufen sollten beibehalten werden.

Jede Klasse hat einen statischen org.slf4j.Logger für seinen eigenen Klassennamen:

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

Dies ist mein aktuell 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 

Antwort

2

Kombinieren Sie die Antwort von Udo Klimaschewski und die Antwort aus dies question, um das gewünschte Ergebnis zu erhalten.

  1. fügen Sie die Eigenschaft append = false
  2. ein current.time Systemeigenschaft hinzuzufügen und es im Namen Datei verwenden
+0

Perfect! Genau das, was ich suchte und viel einfacher als ein benutzerdefinierter FileAppender wie folgt: http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-a-ach-time- The-Application-runs/Aber wahrscheinlich ist es nicht sicher für gleichzeitige Ausführungen, aber das ist kein Problem für mich – lilalinux

+2

'Die Antwort von Udo Klimaschewski' -> Sie sind nur mit dem Benutzerprofil verknüpfen. Wir wissen nicht, worauf Sie sich beziehen. –

10

ich Schwierigkeiten hatte, die Wiederauffindungs ​​Antwort Udy des Udo Klimaschewski bezog so habe ich hier meine Lösung. 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 

Dann diesen Block in der Hauptklasse setzen:

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