Impostazione di un nome file di registro per includere la data corrente in Log4j

Vorrei impostare il nome del file di registro per un appender log4j e log4net per avere la data corrente. Stiamo eseguendo rollover giornalieri ma il file di registro corrente non ha una data. Il formato del nome del file di registro sarebbe

logname.2008-10-10.log 

Qualcuno conosce il modo migliore per farmi questo?

modifica: ho dimenticato di dire che vorremmo farlo anche in log4net. Inoltre, qualsiasi soluzione dovrebbe essere utilizzabile in JBoss.

DailyRollingFileAppender è ciò che cerchi esattamente.

        

Utilizzo del file log4j.properties e inclusione di apache-log4j-extras 1.1 nel mio POM con log4j 1.2.16

 log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/logs/application_%d{yyyy-MM-dd}.log 

Sono sicuro al 99% che RollingFileAppender / DailyRollingFileAppender, mentre ti dà la funzionalità di data-rolling che desideri, non ha modo di specificare che il file di log corrente debba usare anche DatePattern .

Si potrebbe semplicemente essere in grado di sottoclass RollingFileAppender (o DailyRollingFileAppender, ho dimenticato quale è in log4net) e modificare la logica di denominazione.

Ho creato un appender che lo farà. http://stauffer.james.googlepages.com/DateFormatFileAppender.java

 /* * Copyright (C) The Apache Software Foundation. All rights reserved. * * This software is published under the terms of the Apache Software * License version 1.1, a copy of which has been included with this * distribution in the LICENSE.txt file. */ package sps.log.log4j; import java.io.IOException; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.log4j.*; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.spi.LoggingEvent; /** * DateFormatFileAppender is a log4j Appender and extends * {@link FileAppender} so each log is * named based on a date format defined in the File property. * * Sample File: 'logs/'yyyy/MM-MMM/dd-EEE/HH-mm-ss-S'.log' * Makes a file like: logs/2004/04-Apr/13-Tue/09-45-15-937.log * @author James Stauffer */ public class DateFormatFileAppender extends FileAppender { /** * The default constructor does nothing. */ public DateFormatFileAppender() { } /** * Instantiate a DailyRollingFileAppender and open the * file designated by filename. The opened filename will * become the ouput destination for this appender. */ public DateFormatFileAppender (Layout layout, String filename) throws IOException { super(layout, filename, true); } private String fileBackup;//Saves the file pattern private boolean separate = false; public void setFile(String file) { super.setFile(file); this.fileBackup = getFile(); } /** * If true each LoggingEvent causes that file to close and open. * This is useful when the file is a pattern that would often * produce a different filename. */ public void setSeparate(boolean separate) { this.separate = separate; } protected void subAppend(LoggingEvent event) { if(separate) { try {//First reset the file so each new log gets a new file. setFile(getFile(), getAppend(), getBufferedIO(), getBufferSize()); } catch(IOException e) { LogLog.error("Unable to reset fileName."); } } super.subAppend(event); } public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize) throws IOException { SimpleDateFormat sdf = new SimpleDateFormat(fileBackup); String actualFileName = sdf.format(new Date()); makeDirs(actualFileName); super.setFile(actualFileName, append, bufferedIO, bufferSize); } /** * Ensures that all of the directories for the given path exist. * Anything after the last / or \ is assumed to be a filename. */ private void makeDirs (String path) { int indexSlash = path.lastIndexOf("/"); int indexBackSlash = path.lastIndexOf("\\"); int index = Math.max(indexSlash, indexBackSlash); if(index > 0) { String dirs = path.substring(0, index); // LogLog.debug("Making " + dirs); File dir = new File(dirs); if(!dir.exists()) { boolean success = dir.mkdirs(); if(!success) { LogLog.error("Unable to create directories for " + dirs); } } } } } 

Non so se sia ansible in Java, ma in .NET la proprietà StaticLogFileName su RollingFileAppender ti dà quello che vuoi. Il valore predefinito è true.

  

Configurazione completa:

           

".log" è per non lasciare che dataformat riconosca il modello di data globale ‘g’ nel log.

Come risposta alle due risposte che menzionano DailyRollingFileAppender (scusa, non ho abbastanza rappresentanti per commentare direttamente su di loro, e penso che questo debba essere menzionato), vorrei avvertire che sfortunatamente gli sviluppatori di quella class hanno documentato che mostra la sincronizzazione e la perdita di dati e raccomanda di perseguire alternative per nuove implementazioni.

DailyRollingFileAppender JavaDoc

È ansible impostare FileAppender in modo dinamico

 SimpleLayout layout = new SimpleLayout(); FileAppender appender = new FileAppender(layout,"logname."+new Date().toLocaleString(),false); logger.addAppender(appender); 

questo esempio creerà logger per ogni minuto, se si desidera modificare per ogni giorno modificare il valore DatePattern .

                   

Anche se usi DailyRollingFileAppender come @gedevan suggerito, otterrai ancora logname.log.2008-10-10 (Dopo un giorno, perché il log del giorno precedente verrà archiviato e la data verrà concatenata al suo nome file). Quindi se vuoi .log alla fine, devi farlo in questo modo su DatePattern:

log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm'.log'