我使用RollingFileAppender配置了一个logback,以使用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在转存时将压缩日志的副本复制到第二个位置?请注意,我希望在原始位置保留一个副本,但将文件复制到第二个位置。 (我需要将文件保留在原始位置一段时间,然后将其删除。复制的文件将无限期保留。)
答案 0 :(得分:1)
我通过扩展TimeBasedRollingPolicy找到了一种方法。感觉有点hackish,但它的工作原理。您需要将新策略类放在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)时。可以修改为在不使用压缩时也可以工作。我不确定这是否是处理此问题的最佳方法。有更好的想法吗?