我正在使用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 吗?
提前致谢 盖伊
答案 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>