Frage

Ich mag die Protokolldateinamen für einen log4j und log4net Appender, um den aktuellen Zeitpunkt zu haben. Wir tun Tägliche Prolongationen aber die aktuelle Protokolldatei nicht über ein Datum. Der Protokolldateiname Format wäre

logname.2008-10-10.log

Wer weiß, den besten Weg für mich, dies zu tun?

edit: Ich vergaß zu erwähnen, dass wir auch diese in log4net tun möchte. Plus jede Lösung müßte verwendbar in JBoss sein.

War es hilfreich?

Lösung

DailyRollingFileAppender ist, was Sie genau für die Suche.

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

Andere Tipps

Mit log4j.properties Datei, einschließlich Apache-log4j-Extras 1.1 in meinem POM mit 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

Ich bin 99% sicher, dass RollingFileAppender / DailyRollingFileAppender, während es die Datum Walz Funktionalität gibt Sie wollen, hat keine Möglichkeit, zu spezifizieren, dass die aktuelle Protokolldatei als auch die DatePattern verwenden sollte.

Sie können nur in der Lage sein, einfach eine Unterklasse RollingFileAppender (oder DailyRollingFileAppender, ich vergesse, was was in log4net ist) und die Namenslogik ändern.

Ich habe eine appender erstellt, die das tun werden. 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);
            }
        }
    }
  }

}

Ich weiß nicht, ob es in Java, aber in .NET die Eigenschaft StaticLogFileName auf RollingFileAppender gibt Ihnen möglich ist, was Sie wollen. Die Standardeinstellung ist wahr.

<staticLogFileName value="false"/>

Voll config:

<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; ist nicht das Datumsformat RecogNice das globale Datum Muster 'g' in log im Stich gelassen.

In diesem Beispiel wird Logger für jede Minute werden erstellen, wenn Sie für jeden Tag ändern mögen den DatePattern Wert ändern.

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

Als Reaktion auf die zwei Antworten, die DailyRollingFileAppender erwähnen (sorry, ich habe nicht genug rep zu kommentieren haben direkt, und ich denke, das erwähnt werden muss), würde ich warnen, dass leider die Entwickler dieser Klasse haben dokumentiert, dass er die Synchronisation und Datenverlust aufweist, und empfiehlt, dass Alternativen für neue Einrichtungen verfolgt werden sollen.

DailyRollingFileAppender JavaDoc

Sie können einstellen, FileAppender dynamisch

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

Auch wenn u verwendet DailyRollingFileAppender wie @gedevan vorgeschlagen, u noch logname.log.2008-10-10 erhalten (Nach einem Tag, da am Vortag Protokoll erhält archiviert und wird das Datum verkettet werden, um es Dateiname ist). Also, wenn u am Ende .log wollen, wird u haben es so auf dem DatePattern zu tun:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top