最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Logback 使用TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改操作

 更新時(shí)間:2021年08月30日 10:29:13   作者:程序猿DD  
這篇文章主要介紹了Logback 使用TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Logback TurboFilter實(shí)現(xiàn)日志級(jí)別等內(nèi)容的動(dòng)態(tài)修改

可能看到這個(gè)標(biāo)題,讀者會(huì)問:要修改日志的級(jí)別,不是直接修改log.xxx就好了嗎?為何要搞那么復(fù)雜呢?所以,先說一下場(chǎng)景

為什么要通過TurboFilter去動(dòng)態(tài)的修改日志級(jí)別

我們?cè)谑褂肑ava開發(fā)各種項(xiàng)目的時(shí)候必然的會(huì)引入很多框架,這些框架通過堆疊的方式完成所要提供的業(yè)務(wù)服務(wù)(一個(gè)服務(wù)請(qǐng)求在進(jìn)入后會(huì)在這些框架中兜一圈,然后返回結(jié)果),當(dāng)一個(gè)比較底層的框架在處理過程中拋出了異常之后,這個(gè)異常會(huì)不斷的向上傳遞。

這個(gè)時(shí)候,有的框架直接throw,繼續(xù)向上拋,而有的在throw之前還會(huì)自己打印一下error日志,這就導(dǎo)致了當(dāng)出現(xiàn)異常的時(shí)候,往往會(huì)出現(xiàn)一連串類似的錯(cuò)誤日志記錄。如果對(duì)接了錯(cuò)誤日志告警,就會(huì)出現(xiàn)重復(fù)告警的現(xiàn)象。為了解決類似這樣的問題,修改源碼重新編譯最直接,但是不可取。

所以希望可以有更好的手段去控制這些已經(jīng)被編碼固化的日志打印信息。當(dāng)我們使用Logback的時(shí)候,TurboFilter就是解決該問題的工具之一。

TurboFIlter不同于之前在[《Logback中如何自定義靈活的日志過濾規(guī)則》]一文中介紹的那些通過ch.qos.logback.core.filter.Filter接口實(shí)現(xiàn)的過濾器。ch.qos.logback.core.filter.Filter實(shí)現(xiàn)的過濾器是與Appender綁定的,而TurboFIlter是與日志上下文綁定的,它會(huì)過濾所有的日志請(qǐng)求,并且TurboFIlter的方法中提供了豐富的可訪問信息用來進(jìn)行控制和改寫。

比如下面的實(shí)現(xiàn),通過繼承ch.qos.logback.classic.turbo.TurboFilter類,并重寫decide方法,將org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter類中原本要打印的ERROR日志DENY掉(過濾掉),同時(shí)以WARN級(jí)別打印一封相同的內(nèi)容,這樣就實(shí)現(xiàn)了對(duì)已定義日志的動(dòng)態(tài)修改。

public class ForceWarnFilter extends TurboFilter {
    @Override
    public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable throwable) {
        if (level == Level.ERROR && logger.getName().equals("org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter")) {
            logger.warn(marker, format, params);
            return FilterReply.DENY;
        }
        return FilterReply.NEUTRAL;
    }
}

為了讓上面定義的過濾器生效,需要在logback的配置xml中增加如下配置:

<configuration>
    <turboFilter class="com.didispace.log.filter.ForceWarnFilter" />
    ......
</configuration>

或者也可以在應(yīng)用主類中增加:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
lc.addTurboFilter(new MyTurboFilter());

更多關(guān)于Logback過濾器的內(nèi)容可參考官方文檔

logback動(dòng)態(tài)設(shè)置某個(gè)類的日志級(jí)別

假設(shè)一下,現(xiàn)在有這么個(gè)情況

你調(diào)別人的接口出問題了,但是怎么排查都定位不了原因。只能借助更詳細(xì)的日志信息,這個(gè)時(shí)候,又不想把全局的日志級(jí)別調(diào)低,畢竟調(diào)低對(duì)并發(fā)量大的應(yīng)用來說,瞬間會(huì)涌出很多很多日志信息。

最好的情況就是,只調(diào)整出問題的那個(gè)類的日志級(jí)別。那怎么辦呢?

于是就有了下面的方案

定向修改某個(gè)class的logger日志級(jí)別。

 public void testLog(String key, String level, String level2){
        LoggerContext loggerContext= (LoggerContext) LoggerFactory.getILoggerFactory();
        //設(shè)置全局日志級(jí)別
        ch.qos.logback.classic.Logger logger=loggerContext.getLogger("root");
        logger.setLevel(Level.toLevel(level));
 
        if (!StringUtils.isBlank(level2)) {
            //設(shè)置某個(gè)類日志級(jí)別-可以實(shí)現(xiàn)定向日志級(jí)別調(diào)整
            ch.qos.logback.classic.Logger vLogger = loggerContext.getLogger(key);
            if (vLogger!=null)
                vLogger.setLevel(Level.toLevel(level2));
        }
 
        List<ch.qos.logback.classic.Logger> loggerList = loggerContext.getLoggerList();
        for (ch.qos.logback.classic.Logger logger1 : loggerList){
            log.info(logger1.getName());
        }
    }

比如:

     level = ERROR
     level2 = INFO
     key = "com.duy.soo.web.controller.TestController"

表示把全局日志級(jí)別設(shè)置為ERROR級(jí)別,單獨(dú)把com.duy.soo.web.controller.TestController類的日志設(shè)置為INFO級(jí)別。

/**
 * @Author changle
 * @Time 17/6/30.
 * @Desc to do
 */
@Slf4j
@Controller
@RequestMapping(value = "/api/test")
public class TestController {
    @RequestMapping("/testDebug")
    @ResponseBody
    public Response<String> testLog(String key){
        //打印日志級(jí)別
        String rtn = "this is a INFO";
        log.info(rtn);
        rtn = "this is a ERROR";
        log.error(rtn);
        rtn = "this is a DEBUG";
        log.debug(rtn);
        Response<String> response = Response.ok(rtn);
        return response;
    }
}

如此一來,除了com.duy.soo.web.controller.TestController類以外的其他類,都只輸出ERROR日志,而TestController類能輸出INFO日志信息。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java如何獲取本地操作系統(tǒng)進(jìn)程列表

    java如何獲取本地操作系統(tǒng)進(jìn)程列表

    本文介紹了java中是如何獲取當(dāng)前本地操作系統(tǒng)正在運(yùn)行的系統(tǒng)進(jìn)程的信息,需要的朋友可以參考下
    2015-07-07
  • kotlin java 混合代碼 maven 打包實(shí)現(xiàn)

    kotlin java 混合代碼 maven 打包實(shí)現(xiàn)

    這篇文章主要介紹了kotlin java 混合代碼 maven 打包實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • java Socket實(shí)現(xiàn)簡(jiǎn)單模擬HTTP服務(wù)器

    java Socket實(shí)現(xiàn)簡(jiǎn)單模擬HTTP服務(wù)器

    這篇文章主要介紹了java Socket實(shí)現(xiàn)簡(jiǎn)單模擬HTTP服務(wù)器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 美化java代碼,從合理注釋開始

    美化java代碼,從合理注釋開始

    在Java的編寫過程中我們需要對(duì)一些程序進(jìn)行注釋,除了自己方便閱讀,更為別人更好理解自己的程序,可以是編程思路或者是程序的作用,總而言之就是方便自己他人更好的閱讀。下面我們來一起學(xué)習(xí)一下吧
    2019-06-06
  • 一文讀懂Java Iterator(迭代器)

    一文讀懂Java Iterator(迭代器)

    這篇文章主要介紹了Java Iterator(迭代器)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • java代碼審計(jì)之目錄遍歷的解決

    java代碼審計(jì)之目錄遍歷的解決

    目錄穿越漏洞,也叫做目錄遍歷/路徑遍歷漏洞,本文主要介紹了java代碼審計(jì)之目錄遍歷的解決,文中通過案例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解

    Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解

    這篇文章主要介紹了Java中對(duì)象快速?gòu)?fù)制的幾種方式詳解,對(duì)象的克隆是指創(chuàng)建一個(gè)新的對(duì)象,且新的對(duì)象的狀態(tài)與原始對(duì)象的狀態(tài)相同,當(dāng)對(duì)克隆的新對(duì)象進(jìn)行修改時(shí),不會(huì)影響原始對(duì)象的狀態(tài),需要的朋友可以參考下
    2023-08-08
  • intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程詳解

    intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程詳解

    這篇文章主要介紹了intellij idea中安裝、配置mybatis插件Free Mybatis plugin的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 關(guān)于@Valid注解大全以及用法規(guī)范

    關(guān)于@Valid注解大全以及用法規(guī)范

    這篇文章主要介紹了關(guān)于@Valid注解大全以及用法規(guī)范,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 獲取中文拼音首字母及全拼的實(shí)踐

    java 獲取中文拼音首字母及全拼的實(shí)踐

    本文主要介紹了java 獲取中文拼音首字母及全拼的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

博兴县| 农安县| 工布江达县| 朔州市| 澜沧| 盈江县| 什邡市| 威海市| 治多县| 施甸县| 尚义县| 奉新县| 合肥市| 乡城县| 普定县| 镇平县| 海淀区| 建始县| 合作市| 南安市| 诸暨市| 小金县| 安康市| 海城市| 尤溪县| 永州市| 石泉县| 常德市| 江永县| 宝清县| 河津市| 蓝田县| 马鞍山市| 合水县| 民丰县| 侯马市| 嘉峪关市| 白朗县| 讷河市| 信宜市| 延川县|