6

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

4

1 回答 1

2

我想出了一种通过扩展 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)时才有效。可以修改为在不使用压缩时也可以工作。我不确定这是否是处理此问题的最佳方法。有更好的想法吗?

于 2013-09-18T20:00:58.547 回答