Spring 引导 logback.xml 创建 .tmp 文件

Spring Boot logback.xml creating .tmp Files

我正在尝试保留 Spring 启动应用程序的日志,但是,由于生成的日志很大,我正在尝试使用 logback.xml 将大于 350MB 的文件滚动到一个压缩文件。

我每天可以滚动几 MB,但服务在中途开始写入临时文件。我已经尝试了“TimeBasedRollingPolicy”和“Size AndTimeBasedRollingPolicy”以及“SizeAndTimeBasedFNATP”的触发策略,但结果没有改变。每次都会生成.tmp 文件。

我的 Logback.xml 看起来像这样:

 <?xml version="1.0" encoding="UTF-8"?>

<configuration>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/home/xyz/logs/ProdLog.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/home/xyz/logs/log_%d{yyyy-MM-dd}_%i.log.zip</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 350MB -->
                <maxFileSize>350MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>5</maxHistory>
            <!--<maxFileSize>350MB</maxFileSize>-->
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
        %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        </Pattern>
        </layout>
    </appender>
    <root level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

我看到 logback .tmp 文件问题的票证在 Jira 上标记为已关闭。有人可以帮助解决此处需要修改的内容以避免生成临时文件吗?

我在使用 logback 1.2.3 时遇到了同样的问题,显然该错误已在 1.3.0 版本中修复,但我找到了负责生成这些 tmp 文件的代码行并设法避免了它。

这是来自 TimeBasedRollingPolicy.java 的代码:

public void rollover() throws RolloverFailure {

    // when rollover is called the elapsed period's file has
    // been already closed. This is a working assumption of this method.

    String elapsedPeriodsFileName = timeBasedFileNamingAndTriggeringPolicy.getElapsedPeriodsFileName();

    String elapsedPeriodStem = FileFilterUtil.afterLastSlash(elapsedPeriodsFileName);

    if (compressionMode == CompressionMode.NONE) {
        if (getParentsRawFileProperty() != null) {
            renameUtil.rename(getParentsRawFileProperty(), elapsedPeriodsFileName);
        } // else { nothing to do if CompressionMode == NONE and parentsRawFileProperty == null }
    } else {
        if (getParentsRawFileProperty() == null) {
            compressionFuture = compressor.asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elapsedPeriodStem);
        } else {
            compressionFuture = renameRawAndAsyncCompress(elapsedPeriodsFileName, elapsedPeriodStem);
        }
    }

    if (archiveRemover != null) {
        Date now = new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime());
        this.cleanUpFuture = archiveRemover.cleanAsynchronously(now);
    }
}

Future<?> renameRawAndAsyncCompress(String nameOfCompressedFile, String innerEntryName) throws RolloverFailure {
    String parentsRawFile = getParentsRawFileProperty();
    String tmpTarget = nameOfCompressedFile + System.nanoTime() + ".tmp";
    renameUtil.rename(parentsRawFile, tmpTarget);
    return compressor.asyncCompress(tmpTarget, nameOfCompressedFile, innerEntryName);
}

正如您在此处看到的,如果您将 "fileName" 设置到附加程序中,则会调用该方法并生成一个 tmp 文件(这还不错)。我认为当有线程不停止记录该 tmp 文件时就会出现问题,所以最后有线程写入 tmp 文件而其他线程写入新的 "fileName" 文件。

如果只设置 fileNamePattern 标签而不是文件标签,则不应生成 tmp 文件。

希望对您有所帮助!