Domanda

Vorrei impostare il nome del file di registro per un appender log4j e log4net in modo che abbia la data corrente. Stiamo effettuando 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 farlo?

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

È stato utile?

Soluzione

DailyRollingFileAppender è esattamente ciò che stai cercando.

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

Altri suggerimenti

Uso del file log4j.properties e incluso 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 che desideri, non ha alcun modo per specificare che il file di registro corrente dovrebbe usare DatePattern anche.

Potresti semplicemente essere in grado di sottoclassare semplicemente RollingFileAppender (o DailyRollingFileAppender, dimentico quale è 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 <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);
            }
        }
    }
  }

}

Non so se sia possibile in Java, ma in .NET la proprietà StaticLogFileName su RollingFileAppender ti dà quello che vuoi. L'impostazione predefinita è vera.

<staticLogFileName value="false"/>

Configurazione 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>

& amp; quot; .log & amp; quot; è per non consentire al formato della data di riconoscere il modello di data globale 'g' nel registro.

questo esempio creerà un logger per ogni minuto, se vuoi cambiare per ogni giorno cambia il valore 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>

Come risposta alle due risposte che menzionano DailyRollingFileAppender (scusate, non ho abbastanza rappresentante per commentarle direttamente e penso che questo debba essere menzionato), avvertirei che purtroppo gli sviluppatori di quella classe hanno ha documentato che mostra sincronizzazione e perdita di dati e raccomanda di cercare alternative per nuove implementazioni.

DailyRollingFileAppender JavaDoc

Puoi impostare FileAppender in modo dinamico

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

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top