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

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

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

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

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

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

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

這個(gè)時(shí)候,有的框架直接throw,繼續(xù)向上拋,而有的在throw之前還會自己打印一下error日志,這就導(dǎo)致了當(dāng)出現(xiàn)異常的時(shí)候,往往會出現(xiàn)一連串類似的錯(cuò)誤日志記錄。如果對接了錯(cuò)誤日志告警,就會出現(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是與日志上下文綁定的,它會過濾所有的日志請求,并且TurboFIlter的方法中提供了豐富的可訪問信息用來進(jìn)行控制和改寫。

比如下面的實(shí)現(xiàn),通過繼承ch.qos.logback.classic.turbo.TurboFilter類,并重寫decide方法,將org.springframework.cloud.sleuth.instrument.web.ExceptionLoggingFilter類中原本要打印的ERROR日志DENY掉(過濾掉),同時(shí)以WARN級別打印一封相同的內(nèi)容,這樣就實(shí)現(xiàn)了對已定義日志的動態(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動態(tài)設(shè)置某個(gè)類的日志級別

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

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

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

于是就有了下面的方案

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

 public void testLog(String key, String level, String level2){
        LoggerContext loggerContext= (LoggerContext) LoggerFactory.getILoggerFactory();
        //設(shè)置全局日志級別
        ch.qos.logback.classic.Logger logger=loggerContext.getLogger("root");
        logger.setLevel(Level.toLevel(level));
 
        if (!StringUtils.isBlank(level2)) {
            //設(shè)置某個(gè)類日志級別-可以實(shí)現(xiàn)定向日志級別調(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"

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

/**
 * @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){
        //打印日志級別
        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ì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • java Socket實(shí)現(xiàn)簡單模擬HTTP服務(wù)器

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

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

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

    在Java的編寫過程中我們需要對一些程序進(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • Java中對象快速復(fù)制的幾種方式詳解

    Java中對象快速復(fù)制的幾種方式詳解

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

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

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

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

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

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

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

最新評論

定日县| 赣州市| 杭锦旗| 砚山县| 来安县| 普安县| 洮南市| 北流市| 永仁县| 杭锦旗| 隆尧县| 天门市| 濮阳市| 金寨县| 青神县| 永昌县| 屏边| 凤阳县| 怀宁县| 宝丰县| 太和县| 嫩江县| 印江| 尼玛县| 德格县| 乐安县| 金乡县| 朝阳县| 峨边| 封开县| 阿巴嘎旗| 原平市| 万州区| 富裕县| 措勤县| 舒城县| 长武县| 广安市| 收藏| 荣成市| 裕民县|