线上log日志输出没有具体堆栈信息问题排查

本文详细介绍了在使用logback时遇到的日志输出问题,由于错误地调用了format、可变参数的重载方法,导致无法打印异常堆栈。通过深入源码分析,发现logback的`error`方法不会自动打印异常堆栈。为解决此问题,文章提出需要自定义方法来同时输出异常堆栈和格式化参数。最后强调了理解API实现细节的重要性。
摘要由CSDN通过智能技术生成

一、问题描述

    因错误使用了logback的error日志实现中,format、可变参的重载方法,相当然的以为throwable异常作为可变参数也会打印出具体堆栈。

  1. 线上使用logback日志框架

  2. 调用了logback的format、可变参数的重载方法

 public void error(Marker marker, String format, Object... argArray) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.ERROR, format, argArray, null);
    }


     3.具体的调用代码如下,这样打印的日志,异常堆栈信息是出不来的。

log.error("参数信息{} 描述信息 {} 异常堆栈 {}","参数1","描述1",e);

二、问题定位

  1. 阅读public void error(String format, Object... argArray);方法的源码

  2. 会调用到logback的底层代码filterAndLog_0_Or3Plus方法   

private void filterAndLog_0_Or3Plus(final String localFQCN, final Marker marker, final Level level, final String msg, final Object[] params,
                    final Throwable t) {

        final FilterReply decision = loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg, params, t);

        if (decision == FilterReply.NEUTRAL) {
            if (effectiveLevelInt > level.levelInt) {
                return;
            }
        } else if (decision == FilterReply.DENY) {
            return;
        }
        // 这里会构造异步日志事件,和格式化日志信息
        buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t);
    }

3.继续跟进buildLoggingEventAndAppend的实现

private void buildLoggingEventAndAppend(final String localFQCN, final Marker marker, final Level level, final String msg, final Object[] params,
                    final Throwable t) {
        //具体构造日志事件,核心地方,这里代表了一条日志消息,异步日志框架会对该消息进行格式化输出
        LoggingEvent le = new LoggingEvent(localFQCN, this, level, msg, t, params);
        le.setMarker(marker);
        callAppenders(le);
    }

4.看一下loggingEvent是如何构造的

 

public LoggingEvent(String fqcn, Logger logger, Level level,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值