发布
社区首页 >问答首页 >登入能在滚转时间复制吗?

登入能在滚转时间复制吗?
EN

Stack Overflow用户
提问于 2013-09-17 18:50:40
回答 1查看 808关注 0票数 6

我配置了一个logback,使用RollingFileAppender将其转到带有SizeAndTimeBasedFNATP策略的新日志文件中。我已经设置为滚动到一个新的文件基础上的一天或根据大小。那时,它还会将旧日志压缩到一个zip文件中。

就像这样:

代码语言:javascript
代码运行次数:0
复制
<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在滚动时间复制压缩日志到第二个位置?请注意,我希望在原始位置保留一个副本,但将文件复制到第二个位置。(我需要将文件保存在原位置一段时间,然后删除它。复制的文件将无限期地存在。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-18 20:00:58

我想出了一种通过扩展TimeBasedRollingPolicy来实现这一点的方法。感觉有点不舒服,但很管用。您需要将新的策略类放入ch.qos.logback.core.rolling包中,因为TimeBasedRollingPolicy不便于仅覆盖所需的功能而不包含在包中。

代码语言:javascript
代码运行次数:0
复制
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)时才特别有效。如果不使用压缩,也可以修改为也可以工作。我不确定这是不是处理这件事的最好方法。有更好的主意吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18857644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档