Spring Boot logback.xml 创建 .tmp 文件

2024-05-07

我正在尝试保留 Spring Boot 应用程序的日志,但是,由于生成的日志很大,我正在尝试使用 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 文件。

我希望这可以帮助你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot logback.xml 创建 .tmp 文件 的相关文章

随机推荐

  • 更改 git diff 输出前后的行数

    我想增加更改之前和之后显示的行数git diff output 类似于grep A3 B5 根据git diff help git diff支持与标准相同的参数diff命令 w r t 上下文 U
  • 如何在 Windows 上的 Python 2.7 上安装 Tensorflow?

    我尝试通过 pip 安装 TensorFlow pip install tensorflow 但是得到这个错误 找不到满足tensorflow要求的版本 来自版本 这个问题有解决办法吗 我还是想通过pip安装 如果您只因为 Keras 而需
  • 为什么我不能使用 min 和 max 作为变量名?

    在这个 C 程序中 函数print nums不接受 这vector
  • 按权重分组

    给定以下数据框 import pandas as pd d pd DataFrame Age 18 20 20 56 56 Race A A A B B Response 3 2 5 6 2 Weight 0 5 0 5 0 5 1 2 1
  • 从 MongoDB+Node.js 获取数据到客户端 JavaScript

    如何使用 Node js 连接 MongoDB 然后将结果传递给客户端 JavaScript 并以 HTML 形式显示 var http require http var URL require url var Db require mon
  • 如何在 Julia `DataFrame` 中折叠具有重复时间戳的数据

    我有一个DataFrame对象如下所示 Row timestamp price volume 1 2011 08 14T14 14 40 10 40 0 779 2 2011 08 14T15 15 17 10 40 0 101 3 201
  • 无需动态分配的RSA实现

    典型的 RSA 实现包含一个多精度整数库 典型的多精度整数库使用动态分配将大整数表示为大小合适的机器字数组 我预计当使用多精度整数仅使用 RSA 2048 来加密或解密已知长度的消息 通常是对称加密密钥 时 可能会遇到数学整数的限制 并且它
  • 将行连接成 CLOB

    关于这个主题有很多类似的问题 但我找不到任何解决方案来考虑最终结果对于 varchar2 来说太大的任何问题 所以我想做的就是改变这一点 Column1 Column2 1 Hello 1 world 1 please help 2 Tha
  • 重写方法的返回类型可以不同吗?

    重写方法可以有不同的返回类型 Java supports covariant return types for overridden methods This means an overridden method may have a mo
  • 使用 python 提取 MP3 URL 的 ID3 标签并进行部分下载

    我需要提取远程 mp3 文件的 ID3 标签和元数据 我写了几行可以获取本地文件的ID3标签 from mutagen mp3 import MP3 import urllib2 audio MP3 Whistle mp3 songtitl
  • 在 Pandas 中按索引分组

    如何使用 groupby by 索引 1 2 3 它们的顺序相同 并获得属于每个索引范围的列分数的总和 基本上我有这个 index score 1 2 2 2 3 2 1 3 2 3 3 3 我想要的是 index score sum 1
  • Ionic 2 自定义后退按钮操作

    我想自定义此屏幕截图中提到的后退按钮的单击操作 我希望通过单击我不会返回到上一页 而是返回到我自己指定的页面 或者在返回之前进行处理 要自定义默认后退按钮操作 您需要覆盖返回按钮点击 NavBar 组件的方法 Step 1 在你的 自定义类
  • 将范围传递给 forEach

    我正在尝试使用回调方法addToCount而不是匿名函数forEach 但我无法访问this count其中 返回undefined function Words sentence this sentence sentence this c
  • 在 Transport.send(message) 上获取 ParseException

    由于某种原因 当我在 MimeMessage 上调用 Transport send 时 出现 javax mail internet ParseException 以前 当它只是一封纯文本电子邮件时 这是有效的 但是当我将其更改为同时包含文
  • Spring MVC 中拦截器和过滤器的区别

    我有点困惑Filter and Interceptor目的 据我从文档中了解到 Interceptor在请求之间运行 另一方面Filter在渲染视图之前运行 但在控制器渲染响应之后运行 那么两者的区别在哪里postHandle 在拦截器和d
  • MVC4 中的 ELMAH 和 API 控制器不记录错误

    在 MVC4 中使用 API 控制器 当控制器操作引发异常时 ELMAH 不会记录错误 我认为问题在于 MVC4 将 HTTP 状态代码设置为 500 并且它返回 JSON 对象中的异常详细信息 但它不会抛出未处理的异常 因此 ELMAH
  • 如何在Java中获取具有泛型类型的类

    我正在尝试进行这样的方法调用 public class GenericsTest
  • AttributeError:“MainRouter”对象没有属性“_disabled_count”

    我正在创建一个 kivy 应用程序 其中我使用了显示此错误的路由器 AttributeError MainRouter 对象没有属性 disabled count 有什么解决办法吗 我也得到了这个 但使用 super 修复了它 使用以下命令
  • 为什么 # 后面跟一个数字在 C plus plus 中似乎没有任何作用

    重现步骤 将以下行插入到 C 源代码的任意行中 1234 任何行 包括第一行 最后一行 甚至你也可以像这样在函数头和函数体之间输入 int foo 1234 return 0 数字可以很长 我测试了170多个字符 如果添加任何非数字字符 则
  • Spring Boot logback.xml 创建 .tmp 文件

    我正在尝试保留 Spring Boot 应用程序的日志 但是 由于生成的日志很大 我正在尝试使用 logback xml 将大于 350MB 的文件滚动到压缩文件中 我每天可以滚动几 MB 但中途服务开始写入临时文件 我已经尝试了 Time