web-dev-qa-db-de.com

Festlegen eines Protokolldateinamens zur Aufnahme des aktuellen Datums in Log4j

Ich möchte den Namen der Protokolldatei für einen Log4j- und Log4net-Appender so einstellen, dass er das aktuelle Datum hat. Wir machen tägliche Rollover, aber die aktuelle Protokolldatei hat kein Datum. Das Protokolldateinamenformat wäre 

logname.2008-10-10.log

Weiß jemand, wie ich das am besten kann?

edit: Ich habe vergessen zu erwähnen, dass wir dies auch in log4net machen wollen. Außerdem müsste jede Lösung in JBoss verwendbar sein.

66
Tim

DailyRollingFileAppender ist genau das, wonach Sie suchen.

<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

Verwenden der Datei "log4j.properties" und Einbeziehung von Apache-log4j-extras 1.1 in mein 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
38
shinds

Ich bin zu 99% sicher, dass RollingFileAppender/DailyRollingFileAppender zwar die gewünschte Datumsfunktion bietet, jedoch keine Möglichkeit hat, anzugeben, dass die aktuelle Protokolldatei auch die DatePattern verwenden soll.

Möglicherweise können Sie einfach RollingFileAppender (oder DailyRollingFileAppender (ich vergesse welche in log4net ist) einfach subclassieren und die Benennungslogik ändern.

12
matt b

Ich habe einen Appender erstellt, der das tut. 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

Ich weiß nicht, ob dies in Java möglich ist, aber in .NET gibt die Eigenschaft StaticLogFileName für RollingFileAppender das an, was Sie möchten. Der Standardwert ist true.

<staticLogFileName value="false"/>

Vollständige Konfiguration: 

<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; dient dazu, das Datumsformat nicht das globale Datumsmuster 'g' im Protokoll erkennen zu lassen.

11

Sie können FileAppender dynamisch einstellen

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

Als Antwort auf die beiden Antworten, die DailyRollingFileAppender erwähnen (leider habe ich nicht genug Vertreter, um sie direkt zu kommentieren, und ich denke, dass dies erwähnt werden muss), möchte ich warnen, dass die Entwickler dieser Klasse dies leider dokumentiert haben weist Synchronisation und Datenverlust auf und empfiehlt, dass für neue Bereitstellungen Alternativen gesucht werden.

DailyRollingFileAppender JavaDoc

2
romeara

in diesem Beispiel wird für jede Minute ein Logger erstellt. Wenn Sie für jeden Tag ändern möchten, ändern Sie den Wert für 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

Selbst wenn Sie DailyRollingFileAppender wie @gedevan verwenden, werden Sie immer noch logname.log.2008-10-10 erhalten (Nach einem Tag, da das Protokoll des vorherigen Tages archiviert wird und das Datum mit dem Dateinamen verknüpft wird Ende, du musst es auf dem DatePattern so machen:

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

0
rpajaziti