log4j文件重命名策略

时间:2011-04-10 12:30:30

标签: java log4j

我正在使用log4j 1.2.15,我想知道是否有人对log4j正在使用的令人讨厌的文件重命名策略有一个补救措施。

我会试着解释一下: 我正在使用以下RollingFileAppender创建11个日志文件,每个文件大小为3KB。

log4j.appender.logfile = org.apache.log4j.RollingFileAppender进行
log4j.appender.logfile.File = server.log中 log4j.appender.logfile.MaxFileSize = 3KB log4j.appender.logfile.MaxBackupIndex = 10

问题是在创建新日志文件时,log4j会创建 server.log.1 ,server.log.2等...

我可以配置log4j以保留“.log”后缀,并创建例如 server.1.log 吗?

提前致谢 盖伊

2 个答案:

答案 0 :(得分:1)

我正在使用xml配置(可能没有)和Apache Extras Companion™for Apache log4j™(一个额外的log4j库)。我不认为这可以在没有额外的情况下工作,但它可能会。

关键是使用FileNamePattern

<appender name="logger" class="org.apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.apache.log4j.rolling.FixedWindowRollingPolicy">
        <param name="FileNamePattern" value="/server.%i.log" />
        <param name="MaxIndex" value="10" />
    </rollingPolicy>

    <triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
        <param name="MaxFileSize" value="3000" /> 
    </triggeringPolicy>
</appender>

答案 1 :(得分:0)

我使用Geoff Mottram的Dated File Appender派生的每小时迭代,如下所示,您可以将其作为示例来推导命名策略;检查FileAppender的源代码并查看append方法以查看它检查filesize的位置,然后使用您自己的类覆盖FileAppender,该类正确处理重命名:

package com.fredcheese.log4j;

import java.io.File;
import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.FileAppender;
import org.apache.log4j.spi.LoggingEvent;

/**
 * Based on biz.minaret.log4j.DatedFileAppender, 
 * decompiled with JAD,
 * revised to use optional hours.
 */
public class DistinctDailyFileAppender extends FileAppender {

public static final String DEFAULT_DIRECTORY = "logs";
public static final String DEFAULT_SUFFIX = ".txt";
public static final String DEFAULT_PREFIX = "";

private String directory = DEFAULT_DIRECTORY;
private String prefix = DEFAULT_PREFIX;
private String suffix = DEFAULT_SUFFIX;
private File currentPath = null;
private Calendar currentCalendar = null;
private long nextTime = 0l;
private boolean hourly = false;

/**
 * Constructor.
 */
public DistinctDailyFileAppender() {}

/**
 * This method is automatically called once by the system, 
 * immediately after all properties are set, prior to release.
 */
public void activateOptions() {

    currentPath = new File(directory);
    if (!currentPath.isAbsolute()) {        
        errorHandler.error("Directory failure for appender [" + name + "] : " + directory);
        return;
    }

    currentPath.mkdirs();

    // We can write; initialize calendar
    if (currentPath.canWrite()) {
        currentCalendar = Calendar.getInstance();
    } else {
        errorHandler.error("Cannot write for appender [" + name + "] : " + directory);
        return;
    }       
}

/**
 * This is called, synchronized by parent.
 */
public void append(LoggingEvent event) {

    if (layout == null) {
        errorHandler.error("No layout set for appender [" + name + "].");
        return;
    }

    if (currentCalendar == null) {
        errorHandler.error("Improper initialization for appender [" + name + "].");
        return;
    }

    long nowTime = System.currentTimeMillis();
    if (nowTime >= nextTime) {
        currentCalendar.setTime(new Date(nowTime));
        String timestamp = generateTimestamp(currentCalendar);
        nextCalendar(currentCalendar);
        nextTime = currentCalendar.getTime().getTime();
        File file = new File(currentPath, prefix + timestamp + suffix);
        fileName = file.getAbsolutePath();
        super.activateOptions();
    }

    if (super.qw == null) {

        errorHandler.error("No output stream or file set for the appender named [" + name + "].");
        return;

    } else {

        subAppend(event);
        return;

    }
}

protected String generateTimestamp(Calendar calendar) {

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    int hour = calendar.get(Calendar.HOUR_OF_DAY);
    int minutes = calendar.get(Calendar.MINUTE);
    int seconds = calendar.get(Calendar.SECOND);

    StringBuffer buffer = new StringBuffer();

    if (year < 1000) {
        buffer.append('0');
        if (year < 100) {
            buffer.append('0');
            if (year < 10) {
                buffer.append('0');
            }
        }
    }
    buffer.append(Integer.toString(year));
    buffer.append('-');

    if (month < 10) {
        buffer.append('0');
    }
    buffer.append(Integer.toString(month));
    buffer.append('-');

    if (day < 10) {
        buffer.append('0');
    }
    buffer.append(Integer.toString(day));
    buffer.append('_');

    if (hour < 10) {
        buffer.append('0');
    }
    buffer.append(Integer.toString(hour));

    if (minutes < 10) {
        buffer.append('0');
    }
    buffer.append(Integer.toString(minutes));

    if (seconds < 10) {
        buffer.append('0');
    }
    buffer.append(Integer.toString(seconds));

    return buffer.toString();
}

protected void nextCalendar(Calendar calendar) {
    int i = calendar.get(Calendar.YEAR);
    int j = calendar.get(Calendar.MONTH);

    if (hourly) { 
        int k = calendar.get(Calendar.DAY_OF_MONTH);
        int l = calendar.get(Calendar.HOUR_OF_DAY) + 1;
        calendar.clear();
        calendar.set(i, j, k, l, 0);
    } else {
        int k = calendar.get(Calendar.DAY_OF_MONTH) + 1;
        calendar.clear();
        calendar.set(i, j, k);
    }
}

public String getDirectory() {
    return directory;
}

public void setDirectory(String directory) {
    if (directory == null || directory.length() == 0) {
        this.directory = "."; // Set to here
    } else {
        this.directory = directory;
    }
}

public String getPrefix() {
    return prefix;
}

public void setPrefix(String prefix) {
    if (prefix == null) {
        this.prefix = DEFAULT_PREFIX; // Set to default
    } else {
        this.prefix = prefix;
    }
}

public String getSuffix() {
    return suffix;
}

public void setSuffix(String suffix) {
    if (suffix == null) {
        this.suffix = ""; // Set to empty, not default
    } else {
        this.suffix = suffix;
    }
}

public void setHourly(boolean hourly) {
    this.hourly = hourly;
}

public boolean isHourly() {
    return this.hourly;
}
}

这是我的tomcat的appender XML代码段(不是指小时,但你可以从我的代码中找出它):

<appender name="PRIMARY_APPENDER" class="com.fredcheese.log4j.DistinctDailyFileAppender">
  <param name="Threshold" value="DEBUG"/>
  <param name="Directory" value="X:\\apps\\logs\\cheese\\"/>
  <param name="Append" value="true"/>

  <param name="Prefix" value="appname_log."/>
  <param name="Suffix" value=".txt"/>

  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d{HH:mm:ss,SSS} %-5p [%.3t] %-14.14c{1} %m%n"/>
  </layout>
</appender>