Festlegen eines Protokolldateinamens, um das aktuelle Datum in Log4j aufzunehmen

68

Ich möchte den Namen der Protokolldatei für einen log4j- und einen log4net-Appender so einstellen, dass sie das aktuelle Datum haben. Wir führen tägliche Rollover durch, aber die aktuelle Protokolldatei hat kein Datum. Das Format des Protokolldateinamens wäre

logname.2008-10-10.log

Kennt jemand den besten Weg für mich, dies zu tun?

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

Tim
quelle

Antworten:

53

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>
gedevan
quelle
31
Wird nicht einfach eine Protokolldatei mit dem Namen "application.log" erstellt und nur das Datumsmuster in die gerollten Protokolldateien eingefügt?
Tim
5
Als Ergebnis erhalten Sie für jeden Tag eine separate Protokolldatei. Die heutige Protokolldatei wird jedoch ohne Datum als application.log bezeichnet. Und in den meisten Fällen ist es in Ordnung.
gedevan
1
Zwei Kommentare zu "DatePattern": - Ich verwende ".yyyy-MM-dd.lo \ g", um für alle Protokolldateien dieselbe Erweiterung zu erhalten. - Der Backslash vor g wird benötigt (zumindest für log4net), um zu verhindern, dass .Net das vordefinierte "g" -Format anwendet.
Gyrolf
1
@gyrolf Wenn Sie das von Ihnen erwähnte Format anwenden, werden Ihre Protokolle dann als mylog.log.yyyy-MM-dd.log angezeigt? Oder entfernen Sie irgendwie die vorherige Erweiterung?
James McMahon
3
Aus log4j-Dokumenten: Bei DailyRollingFileAppender wurden Synchronisationsprobleme und Datenverlust festgestellt ( logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/… ). Sie sollten wirklich @shinds Antwort folgen
Keisar
44

Verwenden der Datei log4j.properties und Einfügen 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
shinds
quelle
3
^ --- ^ Pro Level: 99log4j.appender.out.RollingPolicy.FileNamePattern=logs/%d{yyyy-MM-dd HH-mm-ss} cron-script-x/out.log log4j.appender.err.RollingPolicy.FileNamePattern=logs/%d{yyyy-MM-dd HH-mm-ss} cron-script-x/err.log
Alex
Ab sofort sind alle Download-Spiegel-Links defekt. Sie finden die Bibliothek weiterhin im Archiv-Repository: archive.apache.org/dist/logging/log4j/companions/extras
mmutilva
log4j.appender..DatePattern = yyyy-MM-dd erledigt den Trick. Dateiname wird jeden Tag rollen und keine Notwendigkeit für zusätzliche Abhängigkeit
vsingh
12

Ich bin mir zu 99% sicher, dass RollingFileAppender / DailyRollingFileAppender, obwohl es Ihnen die gewünschte Datums-Rolling-Funktionalität bietet, keine Möglichkeit hat, anzugeben, dass die aktuelle Protokolldatei auch das verwenden soll DatePattern.

Möglicherweise können Sie einfach RollingFileAppender (oder DailyRollingFileAppender, ich vergesse, welches in log4net) unterordnen und die Namenslogik ändern.

matt b
quelle
11

Ich habe einen Appender erstellt, der das erledigt. 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);
            }
        }
    }
  }

}
James AN Stauffer
quelle
11

Ich weiß nicht, ob es in Java möglich ist, aber in .NET gibt Ihnen die Eigenschaft StaticLogFileName auf RollingFileAppender, was Sie wollen. 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, dass das Datumsformat das globale Datumsmuster 'g' im Protokoll nicht erkennt.

Lars Corneliussen
quelle
1
Genau das habe ich gesucht.
Raj
Nur zur Klarstellung: Sind die HTML - Entitäten &quotin yyyy-MM-dd&quot;.log&quot;gemeint , dort zu sein, statt '?
Chrki
2

In diesem Beispiel wird ein Logger für jede Minute erstellt. Wenn Sie den DatePatternWert für jeden Tag ändern möchten, ändern Sie ihn .

<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>
Codierer
quelle
2

Als Antwort auf die beiden Antworten, in denen DailyRollingFileAppender erwähnt wird (Entschuldigung, ich habe nicht genügend Mitarbeiter, um sie direkt zu kommentieren, und ich denke, dies muss erwähnt werden), würde ich warnen, dass die Entwickler dieser Klasse dies leider dokumentiert haben weist Synchronisation und Datenverlust auf und empfiehlt, Alternativen für neue Bereitstellungen zu verfolgen.

DailyRollingFileAppender JavaDoc

Romeara
quelle
2

Sie können FileAppender dynamisch einstellen

SimpleLayout layout = new SimpleLayout();           
FileAppender appender = new FileAppender(layout,"logname."+new Date().toLocaleString(),false);
logger.addAppender(appender); 
SANN3
quelle
Seien Sie vorsichtig mit den Schrägstrichen "/" im Dateinamen. Ich würde lieber Benutzer:"logname"+new Date().format("yyyy-mm-dd-hh-MM")+".log"
Cléssio Mendes
Dies erstellt eine neue Protokolldatei nur beim Start der App und schneidet Ihre Protokolle nicht nach Datum in Dateien
Mr. Cat
0

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

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

rpajaziti
quelle