一个好几天都没有想明白的问题,日志乱序了

本文记录了一次在生产环境中观察到的日志时序异常现象,即在同一线程中,接口调用入口日志出现在了两个内部方法日志之间。通过对Logback配置的详细检查,排除了日志框架配置不当的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天发现一个非常奇怪的现象,这里记录下。

上面这张图是同一个实例的同一个线程打印的三行日志,按照时间从近到远排序。

​17:30:09.687和17:30:09.672是同一个方法中的两行日志,但是17:30:09.676这条日志是接口调用的入口日志。

按照正常逻辑来讲,Netty在工作线程没有执行完成之前,不应该会再分配请求给该线程,这也不符合JAVA线程的底层逻辑。

所以中间17:30:09.676这条日志就很奇怪了。

为了确认是否有可能是日志打印出现乱序,对生产环境的日志配置文件排查了下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <property name="LOG_LEVEL" value="INFO"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="com.xiaohongshu.infra.utils.log.jsonlog.JSONEncodingPatternLayoutEncoder">
            <pattern>
                {
                "app":"insight",
                "prdline": "risk-insight",
                "remoteAddr": "%X{remoteAddr}",
                "timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                "logger": "%logger",
                "thread": "%thread",
                "level": "%level",
                "traceId": "%X{traceId}",
                "msg": "%msg",
                "stack_trace": "%exception %nopex"
                }%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <neverBlock>true</neverBlock>
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <appender-ref ref="STDOUT"/>
    </appender>

    <root level="${LOG_LEVEL}">
        <appender-ref ref="ASYNC"/>
    </root>
</configuration>

AsyncAppender内部使用了一个BlockingQueue用于缓存所有日志事件,再使用一个Work线程对象异步处理日志事件。

BlockingQueue是FIFO的,单个Work线程也不存在导致日志乱序的问题。

ConsoleAppenderOutputStreamAppender的具体实现,看起来也太可能导致日志乱序。

因此,应该不是logback框架导致日志时序错乱的问题。

问题先放这儿吧,等什么时候想明白了再来填这个坑。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镜悬xhs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值