Configurando um nome de arquivo de log para include a data atual no Log4j

Eu gostaria de definir o nome do arquivo de log para um log4j e log4net appender para ter a data atual. Estamos fazendo rollovers diários, mas o arquivo de log atual não tem data. O formato do nome do arquivo de log seria

logname.2008-10-10.log 

Alguém sabe o melhor caminho para eu fazer isso?

edit: Eu esqueci de mencionar que nós gostaríamos de fazer isso no log4net também. Além disso, qualquer solução precisaria ser usada no JBoss.

DailyRollingFileAppender é exatamente o que você está procurando.

        

Usando o arquivo log4j.properties e incluindo o apache-log4j-extras 1.1 no meu POM com 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 

Tenho 99% de certeza de que RollingFileAppender / DailyRollingFileAppender, embora ofereça a funcionalidade de rolagem de data desejada, não tem como especificar se o arquivo de log atual também deve usar o DatePattern .

Você pode simplesmente ser capaz de simplesmente subclassificar RollingFileAppender (ou DailyRollingFileAppender, esqueci qual é qual no log4net) e modificar a lógica de nomenclatura.

Eu criei um appender que fará isso. 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); } } } } } 

Não sei se é possível em Java, mas no .NET a propriedade StaticLogFileName em RollingFileAppender fornece o que você deseja. O padrão é verdadeiro.

  

Configuração completa:

           

".log" é para não permitir que o formato de data reconheça o padrão de data global ‘g’ no log.

Como resposta às duas respostas que mencionam DailyRollingFileAppender (desculpe, eu não tenho o suficiente para comentar sobre eles diretamente, e eu acho que isso precisa ser mencionado), eu gostaria de avisar que infelizmente os desenvolvedores dessa class documentaram que exibe synchronization e perda de dados e recomenda que sejam buscadas alternativas para novas implantações.

DailyRollingFileAppender JavaDoc

Você pode definir o FileAppender dinamicamente

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

este exemplo estará criando logger para cada minuto, se você quiser mudar para cada dia, mude o valor de DatePattern .

                   

Mesmo se vc usar o DailyRollingFileAppender como o @gedevan sugerido, vc ainda vai ter o logname.log.2008-10-10 (Depois de um dia, porque o log do dia anterior será arquivado ea data será concatenada ao seu nome de arquivo). Então, se você quiser .log no final, você terá que fazer assim no DatePattern:

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