web-dev-qa-db-fra.com

Définition d'un nom de fichier journal pour inclure la date actuelle dans Log4j

Je voudrais définir le nom du fichier journal pour un appender log4j et log4net pour avoir la date actuelle. Nous procédons à des reconductions quotidiennes, mais le fichier journal actuel n'a pas de date. Le format du nom du fichier journal serait 

logname.2008-10-10.log

Quelqu'un sait le meilleur moyen pour moi de faire ça?

edit: J'ai oublié de mentionner que nous voudrions le faire également dans log4net. De plus, toute solution devrait être utilisable dans JBoss.

66
Tim

DailyRollingFileAppender est ce que vous recherchez exactement.

<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>
51
gedevan

Utiliser le fichier log4j.properties et inclure Apache-log4j-extras 1.1 dans mon POM avec 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
38
shinds

Je suis sûr à 99% que RollingFileAppender/DailyRollingFileAppender, bien qu'il vous offre la fonctionnalité de report de date souhaitée, ne permet pas de spécifier que le fichier journal actuel doit également utiliser la variable DatePattern.

Vous pourriez simplement être en mesure de simplement sous-classe RollingFileAppender (ou DailyRollingFileAppender, j'oublie ce qui est dans log4net) et de modifier la logique de nommage.

12
matt b

J'ai créé un appender qui le fera. 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);
            }
        }
    }
  }

}
11

Je ne sais pas si c'est possible en Java, mais dans .NET, la propriété StaticLogFileName sur RollingFileAppender vous donne ce que vous voulez. Le défaut est vrai.

<staticLogFileName value="false"/>

Configuration complète: 

<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; permet de ne pas laisser le format de date reconnaître le modèle de date global 'g' dans le journal.

11
Lars Corneliussen

Vous pouvez définir FileAppender dynamically

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

En réponse aux deux réponses qui mentionnent DailyRollingFileAppender (désolé, je n'ai pas assez de représentants pour les commenter directement, et je pense que cela doit être mentionné), je tiens à avertir que, malheureusement, les développeurs de cette classe ont documenté montre la synchronisation et la perte de données, et recommande que des alternatives soient recherchées pour les nouveaux déploiements.

DailyRollingFileAppender JavaDoc

2
romeara

cet exemple créera un enregistreur pour chaque minute, si vous voulez changer pour chaque jour, changez la valeur DatePattern.

<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>
1
codder

Même si vous utilisez DailyRollingFileAppender comme suggéré par @gedevan, vous aurez toujours logname.log.2008-10-10 (après un jour, car le journal de la veille sera archivé et la date sera concaténée à son nom de fichier) . Donc, si vous voulez .log à la fin, vous devrez le faire comme ceci sur le DatePattern:

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

0
rpajaziti