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日志打印被忽略输出的资料请关注Devmax其它相关文章!

源码分析SpringMvc日志打印被忽略输出问题的更多相关文章

  1. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  2. JSP中springmvc配置validator的注意事项

    这篇文章主要介绍了JSP中springmvc配置validator的注意事项的相关资料,并说明springmvc中spring-servlet.xml、applicationContext.xml的区别需要的朋友可以参考下

  3. SpringMVC拦截器和异常处理器使用示例超详细讲解

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器参数及拦截器链配置,感兴趣的可以尝试一下

  4. 使用Spring AOP实现用户操作日志功能

    这篇文章主要介绍了使用Spring AOP实现了用户操作日志功能,功能实现需要一张记录日志的log表,结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. SpringMVC数据页响应ModelAndView实现页面跳转

    本文主要介绍了SpringMVC数据页响应ModelAndView实现页面跳转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. SpringMVC静态资源配置过程详解

    在javaweb项目中配置了DispatcherServlet的情况下,如果不进行额外配置的话,几乎所有的请求都会走这个servlet来处理,默认静态资源按路径是访问不到的会报404错误,下面就来讲一讲如何配置才能访问到静态资源吧

  7. Laravel 重写日志,让日志更优雅

    这篇文章主要介绍了Laravel 重写日志,让日志更优雅,laravel框架俗称优雅的框架,所以有想对laravel中的日志重写使其更加方便的记录信息获取信息的同学可以参考下

  8. Jsp结合XML+XSLT将输出转换为Html格式

    我们知道XMLXSLT就可以直接输出到支持XML的浏览器上,如IE5.0以上,但是,我们还要考虑到有不少浏览器不直接支持XML,在这种情况下,我们需要在服务器上进行转换成html输出到浏览器,这种临时过渡办法恐怕要在一段时间内一直要使用.使用Jsp加上tablib标识库,我们可以完成这种转换。

  9. Python格式化输出字符串的五种方法总结

    Python语言有许多优点,常用于不同的领域,如数据科学、web开发、自动化运维等。本文将学习如何使用字符串中内置的方法来格式化字符串,感兴趣的可以了解一下

  10. Spring Boot日志的打印与持久化详细解析

    Spring Boot默认使用SLF4J+Logback 记录日志,并提供了默认配置,即使我们不进行任何额外配,也可以使用SLF4J+Logback进行日志输出

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部