سؤال

وأود أن تعيين اسم ملف السجل لlog4j وlog4net appender أن يكون التاريخ الحالي. نقوم به الانقلاب اليومية ولكن ملف السجل الحالي ليس لديه تاريخ. إن شكل اسم ملف السجل يكون

logname.2008-10-10.log

أحد يعرف أفضل طريقة بالنسبة لي أن أفعل هذا؟

وتحرير: نسيت أن أذكر أننا نريد أن نفعل هذا في log4net كذلك. بالإضافة إلى أي حل من شأنه أن تحتاج إلى أن تكون صالحة للاستعمال في جبوس.

هل كانت مفيدة؟

المحلول

وDailyRollingFileAppender هو ما كنت بالضبط تبحث عنه.

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

نصائح أخرى

<ع> استخدام ملف log4j.properties، وبما في ذلك اباتشي-log4j-اشياء 1.1 في بلدي POM مع 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

وأنا متأكد من أن 99٪ RollingFileAppender / DailyRollingFileAppender، في حين أنها تعطيك وظيفة المتداول التاريخ الذي تريده، ليس لديه أي وسيلة لتحديد أن ملف السجل الحالي يجب استخدام DatePattern كذلك.

هل يمكن أن يكون مجرد قادرا على مجرد فئة فرعية RollingFileAppender (أو DailyRollingFileAppender، أنسى وهو الذي في log4net) وتعديل المنطق التسمية.

ولقد خلق appender من شأنها أن تفعل ذلك. 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);
            }
        }
    }
  }

}

وأنا لا أعرف ما إذا كان من الممكن في جاوة، ولكن في. NET على StaticLogFileName الممتلكات على RollingFileAppender يمنحك ما تريد. الافتراضي هو الصحيح.

<staticLogFileName value="false"/>

والتكوين الكامل:

<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; هو لعدم السماح للdateformat recognice نمط التاريخ العالمي "ز" في السجل.

وهذا المثال سيتم خلق مسجل لكل دقيقة، إذا كنت ترغب في تغيير لكل يوم تغيير قيمة 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>

وردا على اثنين من الإجابات التي تذكر DailyRollingFileAppender (آسف، أنا لم يكن لديك ما يكفي من ممثل والتعليق عليها مباشرة، وأعتقد أن هذا يحتاج إلى أن يذكر)، وأود أن نحذر من أن سوء الحظ لمطوري تلك الفئة لديها وثقت أنه يسلك التزامن وفقدان البيانات، وأوصي بأن البدائل ينبغي السعي لنشر جديدة.

DailyRollingFileAppender جافادوك

ويمكنك تعيين FileAppender حيوي

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

وحتى إذا ش استخدام DailyRollingFileAppender مثلgedevan المقترحة، سوف ش لا يزال الحصول على logname.log.2008-10-10 (بعد يوم، لأن سجل اليوم السابق سوف تحصل على أرشفة وسوف تكون متصلا التاريخ إلى أنها اسم الملف). حتى إذا ش تريد .LOG في النهاية، ش سوف تضطر إلى القيام بذلك من هذا القبيل على DatePattern:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top