可以在翻转时进行回溯制作副本吗?

时间:2013-09-17 18:50:41

标签: java logback

我使用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在转存时将压缩日志的副本复制到第二个位置?请注意,我希望在原始位置保留一个副本,但将文件复制到第二个位置。 (我需要将文件保留在原始位置一段时间,然后将其删除。复制的文件将无限期保留。)

1 个答案:

答案 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)时。可以修改为在不使用压缩时也可以工作。我不确定这是否是处理此问题的最佳方法。有更好的想法吗?