我配置了一个logback,使用RollingFileAppender将其转到带有SizeAndTimeBasedFNATP策略的新日志文件中。我已经设置为滚动到一个新的文件基础上的一天或根据大小。那时,它还会将旧日志压缩到一个zip文件中。
就像这样:
<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>%d{yyyy/MM/dd}/log.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
是否有一种方法可以让logback在滚动时间复制压缩日志到第二个位置?请注意,我希望在原始位置保留一个副本,但将文件复制到第二个位置。(我需要将文件保存在原位置一段时间,然后删除它。复制的文件将无限期地存在。)
发布于 2013-09-18 20:00:58
我想出了一种通过扩展TimeBasedRollingPolicy来实现这一点的方法。感觉有点不舒服,但很管用。您需要将新的策略类放入ch.qos.logback.core.rolling包中,因为TimeBasedRollingPolicy不便于仅覆盖所需的功能而不包含在包中。
public class DuplicatingTimeBasedRollingPolicy<E> extends TimeBasedRollingPolicy<E> {
// root directory of log (so we can retain subdirectory structures in copy)
String originalRoot;
// root directory for secondary log location
String duplicateRoot;
@Override
Future<?> asyncCompress(String nameOfFile2Compress,
String nameOfCompressedFile, String innerEntryName)
throws RolloverFailure {
// Do standard async compression
final Future<?> future = super.asyncCompress(nameOfFile2Compress, nameOfCompressedFile,
innerEntryName);
// Figure out the file name to copy to and from
String extension = compressionMode == CompressionMode.ZIP ? ".zip" : ".gz";
final String sourceFileName = nameOfCompressedFile + extension;
final String destFileName = duplicateRoot + File.separator + sourceFileName.substring(originalRoot.length());
new Thread(new Runnable() {
@Override
public void run() {
try {
// Wait for compression to finish and then make a copy
future.get();
FileUtils.copyFile(new File(sourceFileName), new File(destFileName));
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
return future;
}
}
请注意,这只在滚动时使用压缩(zip或gz)时才特别有效。如果不使用压缩,也可以修改为也可以工作。我不确定这是不是处理这件事的最好方法。有更好的主意吗?
https://stackoverflow.com/questions/18857644
复制相似问题