源码分析SpringMvc日志打印被忽略输出问题

 更新时间:2022年08月24日 15:42:15   作者:llsydn  
这篇文章主要为大家介绍了源码分析SpringMvc日志打印被忽略输出问题,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1.写在前面

在java的开发过程中,涉及到java web的开发,基本上都是走spring这一套了。

我们之前一般来说,都会说mvc:Model(模型业务)、View(视图界面)、Controller(控制器)。这个学习java开发的,应该都懂吧,这里就不多说了。

这里,我们先着重解析下Controller:

Controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

那作为控制层的框架,一般有springmvc、struts2,struts2一些老的框架可能会用到,新的一些框架,基本就很少见了,都走springmvc这套了。

springmvc,我们就用得多了,但是对于SpringMvc日志打印被忽略输出的问题,有无人研究过呢?

嘿嘿,巧了,这个问题,哥们研究过了,那我们今天就来分析下这个问题喽!!!

2.问题引出

DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor Read "application/json;charset=UTF-8" to [QueryData(pageNo=1, pageSize=10, sortField=, sortOrder=asc, params={Q_XM_S_EQ=llsydn, Q_SJH_S_EQ=135 (truncated)...]

可以看到控制台打印的日志,出现了 (truncated)...

这里对应的前端页面的功能是这样的:

很明显,springmvc接收到前端传进来的参数,然后会在控制台打印相关的日志。但是这里的参数,日志打印是不完整的。出现了 (truncated)...截取的问题。

看到这,有好奇心的小伙伴,估计都想探个究竟了吧?(别说你不想😒)

好嘛好嘛,是我自己想探个究竟啦!!!(卑微)

那这里我们先从源码中,找到被截取的地方喽。

3.截取源码分析

首先这里,要如何进行源码查看呢?这里我们可以从打印的日志入手......

  • RequestResponseBodyMethodProcessor

进入到RequestResponseBodyMethodProcessor类中,查看log打印日志的地方,并没有发现打印日志的代码。

那我们就将该类所有的方法都打上断点(主要是该类不算很大),再发一个请求,断点调试一下:

  • 进入到readWithMessageConverters,方法里面来了

经过一步步执行,执行到

Object arg = readWithMessageConverters(inputMessage, parameter, paramType);

可以看到控制台,就打印了我们刚才的日志

那这里,我们就可以继续往readWithMessageConverters,里面进行查看(再发一个请求)

经过一步步执行,执行到LogFormatUtils.traceDebug

可以看到控制台,就打印了我们刚才的日志

那这里,将其他的断点去掉,再这里点一个,然后再发一个请求进来。

嘿嘿,看到这,估计大家都知道了吧。

当参数字符超过100,这里就会截取。

看到这里,我们是通过源码,一步步的找到最终的原因,那这里只是提供一个方法,思路。

大家伙可以自己动手去调试一波,毕竟也不难,哈哈!

这里贴一下,最终的业务逻辑代码,如下:

(limitLength && str.length() > 100 ? str.substring(0, 100) + " (truncated)..." : str);

可以看到,当limitLength为true时,str长度大于100,就会截取前100个字符,后面再拼接 (truncated)...

那我们不禁会想,嘿,哥们想办法把limitLength的值,改为false,不就永远都不会截取输出日志了吗?

嗯嗯,是这么一回事,那这个limitLength的值,如何改?怎么来的?

只能通过源码分析一波了,好啦,这个任务就交给各位了,动手去干活吧!

4.截取问题处理

public boolean isTraceEnabled(Marker marker) {
    final FilterReply decision = callTurboFilters(marker, Level.TRACE);
    if (decision == FilterReply.NEUTRAL) {
        return effectiveLevelInt <= Level.TRACE_INT;
    } else if (decision == FilterReply.DENY) {
        return false;
    } else if (decision == FilterReply.ACCEPT) {
        return true;
    } else {
        throw new IllegalStateException("Unknown FilterReply value: " + decision);
    }
}

通过查看这里的代码,就是这里返回上面limitLength的值。

可以看到这里,我们的改变decision的值,让它变成FilterReply.ACCEPT,这样这里就能返回true 了。

callTurboFilters,如何改呢?这里我百度找到了一个方式:

Logback 使用TurboFilter实现日志级别等内容的动态修改操作。

  • 定义TurboFilter
public class SpringMvcFilter extends TurboFilter {
    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable throwable) {
        if (logger.getName().equals("org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor")) {
            return FilterReply.ACCEPT; //返回accept
        }
        return FilterReply.NEUTRAL;
    }
}
  • logback的配置xml
<configuration>
    <turboFilter class="com.llsydn.log.filter.SpringMvcFilter" />
    ......
</configuration>

看看最终效果:

DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor Read "application/json;charset=UTF-8" to [QueryData(pageNo=1, pageSize=10, sortField=, sortOrder=asc, params={Q_XM_S_EQ=llsydn, Q_SJH_S_EQ=135****4606]

可以看到,springmvc打印的日志,正常了,不再截取了。

好了,以上就是 SpringMvc日志打印被忽略输出问题分析(源码分析) 的分享了。

个人实操可能也不够全面,班门弄斧了。

以上就是源码分析SpringMvc日志打印被忽略输出问题的详细内容,更多关于SpringMvc日志打印被忽略输出的资料请关注脚本之家其它相关文章!

相关文章

  • java实现简单斗地主(看牌排序)

    java实现简单斗地主(看牌排序)

    这篇文章主要介绍了java实现简单斗地主,看牌进行排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2010-11-11
  • SpringBoot的跨域注解@CrossOrigin解析

    SpringBoot的跨域注解@CrossOrigin解析

    这篇文章主要介绍了SpringBoot的跨域注解@CrossOrigin解析,Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它,所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin,需要的朋友可以参考下
    2023-12-12
  • Mybatis实现ResultMap结果集

    Mybatis实现ResultMap结果集

    本文主要介绍了Mybatis实现ResultMap结果集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Spring Boot中扩展XML请求与响应的支持详解

    Spring Boot中扩展XML请求与响应的支持详解

    这篇文章主要给大家介绍了关于Spring Boot中扩展XML请求与响应的支持的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • 一文搞懂Java中的抽象类和接口到底是什么

    一文搞懂Java中的抽象类和接口到底是什么

    在类中没有包含足够的信息来描绘一个具体的对象,这样的类称为抽象类,接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成,本文给大家介绍Java抽象类和接口,感兴趣的朋友一起看看吧
    2022-04-04
  • java回调机制实例详解

    java回调机制实例详解

    这篇文章主要介绍了java回调机制实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • Spring gateway配置Spring Security实现统一权限验证与授权示例源码

    Spring gateway配置Spring Security实现统一权限验证与授权示例源码

    这篇文章主要介绍了Spring gateway配置Spring Security实现统一权限验证与授权,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 图解排序算法之希尔排序Java实现

    图解排序算法之希尔排序Java实现

    希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现
    2021-06-06
  • 浅谈升级Spring Cloud到Finchley后的一点坑

    浅谈升级Spring Cloud到Finchley后的一点坑

    这篇文章主要介绍了浅谈升级Spring Cloud到Finchley后的一点坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 使用Java生成JWT令牌的示例代码

    使用Java生成JWT令牌的示例代码

    json-web-token简称java web令牌,也称作JWT,是一种可以实现跨域身份验证身份的方案,jwt不加密传输数据,但能够通过数据前面验证数据的未被篡改,本文给大家介绍了如何使用Java生成JWT令牌,需要的朋友可以参考下
    2024-04-04

最新评论