2008-10-10 20 views
59

me gustaría establecer el nombre del archivo de registro de log4j y log4net appender tener la fecha actual. Estamos haciendo reinversiones diarias, pero el archivo de registro actual no tiene fecha. El formato del nombre del archivo de registro seríaConfiguración de un nombre de archivo de registro para incluir la fecha actual en Log4J

logname.2008-10-10.log 

¿Alguien sabe la mejor manera de hacerlo?

edición: Olvidé mencionar que nos gustaría hacer esto en log4net también. Además, cualquier solución debería ser utilizable en JBoss.

Respuesta

45

DailyRollingFileAppender es exactamente lo que busca.

<appender name="roll" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="File" value="application.log" /> 
    <param name="DatePattern" value=".yyyy-MM-dd" /> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" 
      value="%d{yyyy-MMM-dd HH:mm:ss,SSS} [%t] %c %x%n %-5p %m%n"/> 
    </layout> 
    </appender> 
+24

¿Esto no basta con crear un archivo de registro denominado "application.log" y sólo colocar el DatePattern en los archivos de registro laminados? – Tim

+3

Como resultado, obtendrá un archivo de registro por separado para cada día. Pero el archivo de registro de hoy se llamará application.log, sin fecha. Y está bien en la mayoría de los casos. – gedevan

+1

Dos comentarios sobre "DatePattern": - Uso ".yyyy-MM-dd.Lo \ g" para conseguir la misma extensión para todos los archivos de registro -. Se necesita la barra invertida antes de g (al menos para log4net) para evitar la aplicación de la .Net predefinido 'formato g' – gyrolf

12

Estoy 99% seguro de que RollingFileAppender/DailyRollingFileAppender, mientras que le da la funcionalidad de la fecha de laminación desea, no tiene ninguna manera de especificar que el archivo de registro actual se debe utilizar el DatePattern también.

Es posible que simplemente pueda simplemente subclase RollingFileAppender (o DailyRollingFileAppender, se me olvida cuál es cuál en log4net) y modifique la lógica de nomenclatura.

10

He creado una appender que va a hacer eso. 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 <code>DailyRollingFileAppender</code> and open the 
    * file designated by <code>filename</code>. 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); 
      } 
     } 
    } 
    } 

} 
+0

James, ¿podría publicar el código dentro de su respuesta? Las páginas de Google están bloqueadas de mi trabajo. –

11

No sé si es posible en Java, pero en el .NET StaticLogFileName propiedad en RollingFileAppender le da lo que quiere. El defecto es cierto.

<staticLogFileName value="false"/> 

configuración completa:

<appender name="DefaultFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="application"/> 
    <staticLogFileName value="false"/> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
    </layout> 
</appender> 

&quot;.log&quot; es para no dejar que el dateformat recognice el patrón de fecha mundial 'g' en el registro.

+1

Esto es exactamente lo que estaba buscando. – Raj

+0

Sólo una aclaración: ¿Son las entidades HTML '' Y quot' en aaaa-MM-dd " .log " 'destinados a estar allí, en lugar de' ' '? – chrki

35

Usando archivo log4j.properties, e incluyendo apache-log4j-extras 1.1 en mi 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 
+3

^---^Nivel Pro: 99 'log4j.appender.out.RollingPolicy.FileNamePattern = logs /% d {aaaa-MM-dd HH-mm-ss} cron-script-x/out.log log4j .appender.err.RollingPolicy.FileNamePattern = logs /% d {aaaa-mM-dd HH-mm-ss} cron-script-x/err.log' – Alex

+0

a partir de ahora, la de descarga enlaces son todos roto. Todavía puede encontrar la biblioteca en el repositorio de archivos: http://archive.apache.org/dist/logging/log4j/companions/extras – mmutilva

+0

log4j.appender..DatePattern = aaaa-MM-dd hará el truco. El nombre del archivo se transferirá todos los días y no se necesita una dependencia adicional – vsingh

1

este ejemplo será la creación de registrador para cada minuto, si usted quiere cambiar para cada día cambiar el DatePattern valor.

<appender name="ASYNC" class="org.apache.log4j.DailyRollingFileAppender"> 
    <param name="File" value="./applogs/logger.log" /> 
    <param name="Append" value="true" /> 
    <param name="Threshold" value="debug" /> 
    <appendToFile value="true" /> 
    <param name="DatePattern" value="'.'yyyy_MM_dd_HH_mm"/> 
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy"> 
     <param name="fileNamePattern" value="./applogs/logger_%d{ddMMMyyyy HH:mm:ss}.log"/> 
     <param name="rollOver" value="TRUE"/> 
    </rollingPolicy> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d{ddMMMyyyy HH:mm:ss,SSS}^[%X{l4j_mdc_key}]^[%c{1}]^ %-5p %m%n" /> 
    </layout> 
</appender> 
<root> 
    <level value="info" /> 
    <appender-ref ref="ASYNC" /> 
</root> 
2

Como respuesta a las dos respuestas que mencionan DailyRollingFileAppender (lo siento, no tengo representante suficiente para comentar sobre ellos directamente, y creo que esto debe ser mencionado), quisiera advertir que, lamentablemente, los desarrolladores de esa clase han documentado que exhibe sincronización y pérdida de datos, y recomiendan que se busquen alternativas para nuevas implementaciones.

DailyRollingFileAppender JavaDoc

1

Puede configurar dinámicamente FileAppender

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

Tenga cuidado con las barras "/" en el nombre del archivo. Prefiero usar: '" logname "+ new Date(). Format (" aaaa-mm-dd-hh-MM ") +" .log "' –

+0

Esto creará un nuevo archivo de registro solo al inicio de la aplicación y no se cortará sus registros en archivos por fecha –

Cuestiones relacionadas