记录一次线上logback日志打印中断问题,深入了解logback.xml

2023-11-11

记录一次线上logback日志打印中断问题:

背景:线上生产环境正在运行的一个微服务,运行一段时间之后,日志log突然消失。打印不出来最新的日志。系统正常运行,无异常。微服务也不收影响,无任何异常,针对这一问题,展开排查


问题描述:

微服务正常运行,各项指标均正常,请求无异常,日志监控平台采集不到最新日志。linux服务器logs指定日志目录下为空,历史log记录也没有。

经过询问开发和运维同事,得知,我们自己有一套日志采集系统,服务器集成的ELK日志采集,业务服务系统,会把日志通过logback打印到外挂磁盘 /data/logs/app/xxx/目录下。 elk会把 /data/logs/app/xxx/目录下日志采集到es数据库,然后通过kibana展示出来。然后会定期删除前几天的/data/logs/app/xxx/的日志文件:
在这里插入图片描述


原因分析:

1.首先排查liunx服务器是否有问题:因为目前/data/logs/目录下完全为空,导致没法排查。追问运维以及相关人员。说elk采集完日志,会定期删掉前几天的文件,当前天的日志不会删除。听起来应该不是服务器问题。

2.排查代码:首先想到的是,本业务系统,是否有删除文件的动作。排查io写入和读取等操作。并没有发现有删除操作。

3.由于是docker容器化部署,不存在一个docker容器存在多个服务的问题。不会是其它业务系统删除

4.检查log日志打印方式,检查配置文件,发现是logback方式。简单看一遍,也没有发现问题,如下

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 文件配置 -->
    <appender name="xxxAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>/data/logs/xxx/app/xxx.%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <!--日志文件最大的大小 -->
        <triggeringPolicy
                class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8} %p %m%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>
    <root>
        <level value="INFO"/>
        <appender-ref ref="xxxAppender"/>
    </root>
</configuration>

5.上面的配置,是通用的配置。好多公司都是这样的。也没有发现特别异常的点。最后只能去logback官网看一下是否有特别说明。

6.通过SizeBasedTriggeringPolicy类TimeBasedRollingPolicy类配置参数了解,
如果设置了SizeBasedTriggeringPolicy类,会导致先判断大小阈值,大小阈值满足了,才会滚动TimeBasedRollingPolicy。

7.通过以上步骤,在结合之前运维给的elk的反馈。大致可以猜测到一个问题点:
SizeBasedTriggeringPolicy阈值设置过大,导致会出现不生成当天新文件. 因为只有满足阈值,才会生产滚动,另外运维日志采集系统采集完日志后,会定期删掉过去历史天数log.
如果现在服务的日志打印少,导致不生成今天新文件,今天的日志还打印在昨天明天的日志文件里面,这个时候elk把昨天的日志文件删除,导致把正在打印的logback程序写入失败。造成服务写入log日志失败,catch会close掉io数据流。从而中断打印。以后也不打印了。造成elk采集不到。还把过去日期文件删除。/data/logs目录下为空

解决方案:

优化logback.xml。
采用SizeAndTimeBasedRollingPolicy类。此类不会先去判断阈值,会优先按照日期滚动,如果满足阈值,也会滚动生成新的日志文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 
    <!-- xxx文件配置 -->
    <appender name="xxxAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>/data/logs/xxx.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxFileSize>100MB</MaxFileSize>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8} %p %m%n</pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>
 
    <root>
        <level value="INFO"/>
        <appender-ref ref="xxxAppender"/>
    </root>
</configuration>

结束

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

记录一次线上logback日志打印中断问题,深入了解logback.xml 的相关文章

  • 如何在 Groovy 中的 JSON Converter 方法中保留字母大小写?

    我正在尝试将 groovy 对象解析为 JSON 属性名称不遵循正确的驼峰式大小写形式 class Client String Name Date Birthdate 当我使用这个时 Client client new Client Nam
  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • 如何在流中收集到TreeMap中?

    我有两个Collectors groupingBy在流中 我需要收集所有信息TreeMap 我的代码 Map
  • 使用 Gson 序列化时如何公开类名

    我的场景非常复杂 但总结如下 我试图了解编译器的源代码 并了解每个 AST 节点代表什么 我正在生成不同程序的 AST 的 JSON 序列化 然后检查可视化的 JSON 输出 它工作得很好 除了一个问题是在 Gson 中生成的 JSON 数
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • 如何在 Java 中安装附加包?

    我对 Java 很陌生 我想使用名为的包中的一些功能daj 教程代码有以下几行 import daj import java util import java lang Math import Msg 但第一行和第四行会产生红色下划线 导致
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • Java - 同步方法导致程序大幅减慢

    我正在尝试了解线程和同步 我做了这个测试程序 public class Test static List
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • kafka Avro 多个主题的消息反序列化器

    我正在尝试以 avro 格式反序列化 kafka 消息 我使用以下代码 https github com ivangfr springboot kafka debezium ksql blob master kafka research c
  • JSP 作为电子邮件模板

    有没有办法发送 MIME 电子邮件 其中电子邮件正文源自 JSP 我需要使用 Javamail 发送一封电子邮件 其中包含一个表格 我认为如果我可以使用 JSP 来完成所有格式设置和布局 将会很方便 在这个线程中 Java 电子邮件模板的建
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • 在openjdk:7-jre-alpine docker上如何安装python 3.6

    直到大约一周前 我才在 java 图像上成功使用 python 3 6 脚本 如下所示 FROM openjdk 7 jre alpine RUN apk update apk upgrade apk add no cache bash a
  • HashSet 与 LinkedHashSet

    它们之间有什么区别 我知道 LinkedHashSet 是 HashSet 的有序版本 维护一个跨所有元素的双向链接列表 使用此类代替 HashSet 当您关心迭代顺序时 当你迭代 HashSet 时 顺序是不可预测的 而 LinkedHa
  • 线程睡眠阻止我的 Swing 应用程序执行

    我的应用程序发生的事情是有道理的 但我不知道如何修复它 以下是我的应用程序功能的简要描述 计时器窗口应显示在屏幕右下角并显示实时时间 一小时后 它应该执行一些操作 我还没有决定该操作 我面临的问题是定时器 java当我刷新实时计时器的秒数时
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • Maven `help: effective-pom` 只为单个项目生成,而不是所有项目

    我想为多模块构建中的所有子项目生成有效的 pom The help effective pom文档here http maven apache org plugins maven help plugin usage html The hel
  • 如何将多部分文件从另一个服务发送到一个服务

    我有两个端点 api 它们是 uploadand 重定向 upload是我直接上传文件的地方 重定向是我接收文件并将其传递给上传并获取 JSON 响应的地方 upload 所以下面是我的代码 package com example impo
  • 不明确的 XML 模式

    我正在尝试为 XML 生成一个非常简单的 XML 架构 类似于以下内容

随机推荐