亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

源碼分析SpringMvc日志打印被忽略輸出問題

 更新時間:2022年08月24日 15:42:15   作者:llsydn  
這篇文章主要為大家介紹了源碼分析SpringMvc日志打印被忽略輸出問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1.寫在前面

在java的開發(fā)過程中,涉及到java web的開發(fā),基本上都是走spring這一套了。

我們之前一般來說,都會說mvc:Model(模型業(yè)務)、View(視圖界面)、Controller(控制器)。這個學習java開發(fā)的,應該都懂吧,這里就不多說了。

這里,我們先著重解析下Controller:

Controller控制器是指控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù)。

那作為控制層的框架,一般有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)...]

可以看到控制臺打印的日志,出現(xiàn)了 (truncated)...

這里對應的前端頁面的功能是這樣的:

很明顯,springmvc接收到前端傳進來的參數(shù),然后會在控制臺打印相關(guān)的日志。但是這里的參數(shù),日志打印是不完整的。出現(xiàn)了 (truncated)...截取的問題。

看到這,有好奇心的小伙伴,估計都想探個究竟了吧?(別說你不想??)

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

那這里我們先從源碼中,找到被截取的地方嘍。

3.截取源碼分析

首先這里,要如何進行源碼查看呢?這里我們可以從打印的日志入手......

  • RequestResponseBodyMethodProcessor

進入到RequestResponseBodyMethodProcessor類中,查看log打印日志的地方,并沒有發(fā)現(xiàn)打印日志的代碼。

那我們就將該類所有的方法都打上斷點(主要是該類不算很大),再發(fā)一個請求,斷點調(diào)試一下:

  • 進入到readWithMessageConverters,方法里面來了

經(jīng)過一步步執(zhí)行,執(zhí)行到

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

可以看到控制臺,就打印了我們剛才的日志

那這里,我們就可以繼續(xù)往readWithMessageConverters,里面進行查看(再發(fā)一個請求)

經(jīng)過一步步執(zhí)行,執(zhí)行到LogFormatUtils.traceDebug

可以看到控制臺,就打印了我們剛才的日志

那這里,將其他的斷點去掉,再這里點一個,然后再發(fā)一個請求進來。

嘿嘿,看到這,估計大家都知道了吧。

當參數(shù)字符超過100,這里就會截取。

看到這里,我們是通過源碼,一步步的找到最終的原因,那這里只是提供一個方法,思路。

大家伙可以自己動手去調(diào)試一波,畢竟也不難,哈哈!

這里貼一下,最終的業(yè)務邏輯代碼,如下:

(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實現(xiàn)日志級別等內(nèi)容的動態(tài)修改操作。

  • 定義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日志打印被忽略輸出問題的詳細內(nèi)容,更多關(guān)于SpringMvc日志打印被忽略輸出的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

    關(guān)于Spring自定義XML schema 擴展的問題(Spring面試高頻題)

    今天給大家分享一道spring高頻率面試題關(guān)于Spring自定義XML schema 擴展的問題,今天以spring整合dubbo的實例給大家詳細講解下,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 實例講解使用Spring通過JPA連接到Db2

    實例講解使用Spring通過JPA連接到Db2

    這篇文章主要介紹了通過實例講解使用Spring通過JPA連接到Db2,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面我們來一起學習一下吧
    2019-06-06
  • JAVA中使用MD5加密實現(xiàn)密碼加密

    JAVA中使用MD5加密實現(xiàn)密碼加密

    本篇文章主要介紹JAVA中使用MD5加密實現(xiàn)密碼加密,很多地方都要存儲用戶密碼,這里整理了詳細的代碼,有需要的小伙伴可以參考下
    2017-07-07
  • java拋出異常與finally實例解析

    java拋出異常與finally實例解析

    這篇文章主要介紹了java拋出異常與finally實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法

    關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法

    這篇文章主要介紹了關(guān)于IDEA2020.1新建項目maven PKIX 報錯問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 修改idea運行內(nèi)存大小的方法總結(jié)

    修改idea運行內(nèi)存大小的方法總結(jié)

    在開發(fā)過程中,總會遇到idea運行內(nèi)存不足,所以本文小編給大家介紹了修改idea運行內(nèi)存大小的兩種方法,文中通過圖文給大家講解的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 解決springboot MultipartFile文件上傳遇到的問題

    解決springboot MultipartFile文件上傳遇到的問題

    本文給大家?guī)砹私鉀Qspringboot MultipartFile文件上傳遇到的問題,解決方法超簡單,感興趣的朋友參考下本文
    2018-08-08
  • spring中的BeanFactory與FactoryBean的講解

    spring中的BeanFactory與FactoryBean的講解

    今天小編就為大家分享一篇關(guān)于spring中的BeanFactory與FactoryBean的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 微服務中使用Maven BOM來管理你的版本依賴詳解

    微服務中使用Maven BOM來管理你的版本依賴詳解

    這篇文章主要介紹了微服務中使用Maven BOM來管理你的版本依賴,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Java寫入寫出Excel操作源碼分享

    Java寫入寫出Excel操作源碼分享

    這篇文章主要介紹了Java寫入寫出Excel操作源碼分享,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12

最新評論