我尝试以这样一种方式配置log4j.xml,即根据文件大小滚动文件,并将滚动文件的名称命名为:"C:/temp/test/test_log4j-%d{yyyy-MM-dd-HH_mm_ss}.log“。我遵循下面的讨论:http://web.archiveorange.com/archive/v/NUYyjJipzkDOS3reRiMz
最后,只有当我添加以下内容时,它才对我起作用:
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}对于该方法:
public boolean isTriggeringEvent(Appender appender, LoggingEvent event,
String filename, long fileLength) 才能让它工作。
问题是,是否有更好的方法让它工作?因为这个方法会调用很多次,会减慢我程序速度。
代码如下:
package com.mypack.rolling;
import org.apache.log4j.rolling.RollingPolicy;
import org.apache.log4j.rolling.RolloverDescription;
import org.apache.log4j.rolling.TimeBasedRollingPolicy;
/**
* Same as org.apache.log4j.rolling.TimeBasedRollingPolicy but acts only as
* RollingPolicy and NOT as TriggeringPolicy.
*
* This allows us to combine this class with a size-based triggering policy
* (decision to roll based on size, name of rolled files based on time)
*
*/
public class CustomTimeBasedRollingPolicy implements RollingPolicy {
TimeBasedRollingPolicy timeBasedRollingPolicy = new TimeBasedRollingPolicy();
/**
* Set file name pattern.
* @param fnp file name pattern.
*/
public void setFileNamePattern(String fnp) {
timeBasedRollingPolicy.setFileNamePattern(fnp);
}
/*
public void setActiveFileName(String fnp) {
timeBasedRollingPolicy.setActiveFileName(fnp);
}*/
/**
* Get file name pattern.
* @return file name pattern.
*/
public String getFileNamePattern() {
return timeBasedRollingPolicy.getFileNamePattern();
}
public RolloverDescription initialize(String file, boolean append) throws SecurityException {
return timeBasedRollingPolicy.initialize(file, append);
}
public RolloverDescription rollover(String activeFile) throws SecurityException {
return timeBasedRollingPolicy.rollover(activeFile);
}
public void activateOptions() {
timeBasedRollingPolicy.activateOptions();
}
}
package com.mypack.rolling;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.Appender;
import org.apache.log4j.rolling.TriggeringPolicy;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.OptionHandler;
/**
* Copy of org.apache.log4j.rolling.SizeBasedTriggeringPolicy but able to accept
* a human-friendly value for maximumFileSize, eg. "10MB"
*
* Note that sub-classing SizeBasedTriggeringPolicy is not possible because that
* class is final
*/
public class CustomSizeBasedTriggeringPolicy implements TriggeringPolicy, OptionHandler {
/**
* Rollover threshold size in bytes.
*/
private long maximumFileSize = 10 * 1024 * 1024; // let 10 MB the default max size
/**
* Set the maximum size that the output file is allowed to reach before
* being rolled over to backup files.
*
* <p>
* In configuration files, the <b>MaxFileSize</b> option takes an long
* integer in the range 0 - 2^63. You can specify the value with the
* suffixes "KB", "MB" or "GB" so that the integer is interpreted being
* expressed respectively in kilobytes, megabytes or gigabytes. For example,
* the value "10KB" will be interpreted as 10240.
*
* @param value
* the maximum size that the output file is allowed to reach
*/
public void setMaxFileSize(String value) {
maximumFileSize = OptionConverter.toFileSize(value, maximumFileSize + 1);
}
public long getMaximumFileSize() {
return maximumFileSize;
}
public void setMaximumFileSize(long maximumFileSize) {
this.maximumFileSize = maximumFileSize;
}
public void activateOptions() {
}
public boolean isTriggeringEvent(Appender appender, LoggingEvent event,
String filename, long fileLength) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
boolean result = (fileLength >= maximumFileSize);
return result;
}
}和log4j.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c -> %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="file" value="C:/temp/test/test_log4j.log" />
<rollingPolicy class="com.mypack.rolling.CustomTimeBasedRollingPolicy">
<param name="fileNamePattern" value="C:/temp/test/test_log4j-%d{yyyy-MM-dd-HH_mm_ss}.log" />
</rollingPolicy>
<triggeringPolicy class="com.mypack.rolling.CustomSizeBasedTriggeringPolicy">
<param name="MaxFileSize" value="200KB" />
</triggeringPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c -> %m%n" />
</layout>
</appender>
<logger name="com.mypack.myrun" additivity="false">
<level value="debug" />
<appender-ref ref="FILE" />
</logger>
<root>
<priority value="debug" />
<appender-ref ref="console" />
</root>
</log4j:configuration>发布于 2011-01-17 00:47:19
如果将调试输出添加到该方法中,您将看到该方法被频繁调用,即使在触发器已经激发之后也是如此,但文件大小仍大于最大文件大小。
我假设滚动行为具有某种类型的缓冲区,该缓冲区在实际的(同步?)发生翻转。
我认为这与com.mypack.rolling.CustomTimeBasedRollingPolicy中的fileNamePattern有关。只要文件名中的“second”没有更改,就会连续调用CustomSizeBasedTriggeringPolicy.isTriggeringEvent方法,其大小大于最大文件大小。
https://stackoverflow.com/questions/4705957
复制相似问题