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

java?log?is判斷引發(fā)的一系列事件解析

 更新時(shí)間:2022年11月07日 11:15:38   作者:雨夜之寂  
這篇文章主要為大家介紹了java?log?is判斷引發(fā)的一系列事件解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

首先來(lái)源是 老大code Review的時(shí)候 說(shuō)到日志,讓我從 log.debug 加上一個(gè)if 判斷,log.isDebug ,這一聽(tīng)就想到是 為了防止debug 日志不打印,導(dǎo)致的String拼接等 沒(méi)必要的損耗

嗯嗯 老大說(shuō)的確實(shí)有道理,改吧

我靠,這一查幾百個(gè) log 需要加,這一個(gè)一個(gè)改也太累了

總 需求列表

  • log 自動(dòng)加上if判斷 如果外面有if判斷了,忽略
  • 最后 寫(xiě)了個(gè)idea 插件。。。。

log 自動(dòng)加上if判斷 調(diào)研

剛上來(lái),我先百度下 是不是有現(xiàn)成的,我現(xiàn)在用的lombok,按道理應(yīng)該有一個(gè)屬性 控制 是否加if的,嗯嗯 沒(méi)錯(cuò),找找,我一般先看看 @Sl4J 給我提供了什么參數(shù)配置

@Retention( RetentionPolicy . SOURCE )
@Target({ElementType.TYPE})
public @interface Slf4j{
    String topic() default
    }

思考 這個(gè)topic干什么的???

說(shuō)實(shí)話 我之前沒(méi)有用過(guò)這個(gè)屬性。。。。狗頭。。

@Slf4j 注解有個(gè)topic 屬性可以進(jìn)行設(shè)置要采用的logger,
topic 的值對(duì)應(yīng)的就是logback.xml中定的logger name。root logger是默認(rèn)就存在的。

到這 你可能要問(wèn)了,root logger 是默認(rèn)實(shí)現(xiàn),你說(shuō)是默認(rèn)實(shí)現(xiàn)就是默認(rèn)實(shí)現(xiàn)了? 證據(jù)呢?

對(duì)應(yīng)的啟動(dòng)Config類(lèi)為 ch.qos.logback.classic.BasicConfigurator

嗯嗯 根上是ROOT

有一個(gè)細(xì)節(jié),我們?cè)谂渲胠ogback.xml的時(shí)候 都會(huì)寫(xiě)這種

<logger name="com" level="DEBUG" >
    <appender-ref ref="STDOUT"/>
</logger>
<logger name="com.example.demo" level="warn" >
    <appender-ref ref="STDOUT"/>
</logger>

你是不是好奇 這種的name怎么解析的?

他是從頭開(kāi)始 遍歷包名 從loggerCache 中看看是否有匹配的,一層層找

思考

不說(shuō)這些理論了,一句話 按照上面配置 logback.xml 在 com.example.demo.controller 下的類(lèi)執(zhí)行會(huì)打印log.info日志么?

@RestController
@RequestMapping
@Slf4j
public class DemoController {
    @RequestMapping("/test")
    public String test(){
        log.info("sad");
        return "success";
    }
}

嗯嗯 這么一實(shí)驗(yàn) 沒(méi)打印啊

有人可能問(wèn)了,那把2個(gè)logger 順序反過(guò)來(lái)? 不用試了,也不行

這一看 com.example.demo的warn生效了啊,debug/info 都沒(méi)打印出來(lái),那為什么呢?

先看一個(gè)圖

下面就要看下 這個(gè)children 當(dāng)時(shí)怎么賦值的了 其實(shí)就是從 最底下 往上找,在這里找到了 com.example.demo 的配置并且應(yīng)用,是因?yàn)?logger類(lèi)中

int h;
do {
    h = LoggerNameUtil.getSeparatorIndexOf(name, i);
    String childName;
    if (h == -1) {
        childName = name;
    } else {
        childName = name.substring(0, h);
    }
    i = h + 1;
    synchronized(logger) {
        childLogger = logger.getChildByName(childName);
        if (childLogger == null) {
            childLogger = logger.createChildByName(childName);
            this.loggerCache.put(childName, childLogger);
            this.incSize();
        }
    }
    logger = childLogger;
} while(h != -1);

一直找到最后,返回的就是最后/最靠近 目標(biāo)類(lèi)的logger 配置

小結(jié)

logger 配置不是按照pom.xml的那種優(yōu)先順序,而是包名匹配 最多的生效,如果你發(fā)現(xiàn) 日志打印和你想的不一樣,你可以去看下 LoggerContext 類(lèi)中 loggerCache 屬性的值,檢查下

如果是一個(gè)業(yè)務(wù)系統(tǒng),可能是一種logback.xml模板,如果你是中間件/組件,就需要對(duì)logback.xml 進(jìn)行改動(dòng)了,因?yàn)橹虚g件可能是 binlog監(jiān)聽(tīng)等等 大數(shù)據(jù)量的,如果按照業(yè)務(wù)系統(tǒng)那種搞法 有的日志是沒(méi)必要,根據(jù)你的業(yè)務(wù) 請(qǐng)自由配置

說(shuō)回來(lái) lombok 到底有沒(méi)有自動(dòng)加if的插件啊

lombok @Sl4j 是沒(méi)有了,百度下吧

好吧,這也什么都沒(méi)有,官網(wǎng)看看,哎 也沒(méi)有,按道理應(yīng)該有啊,也不難。。。

我突然在想是不是這個(gè)優(yōu)化 也不像我們想的那么有優(yōu)化效果,肯定還是有必要的

log isDebug 判斷的必要性

錯(cuò)誤案例

現(xiàn)象描述:發(fā)現(xiàn)某些服務(wù)器的pv數(shù)不高,但服務(wù)器的load卻不低,高于平均水平

錯(cuò)誤分析

分析過(guò)程: 通過(guò)內(nèi)存監(jiān)控發(fā)現(xiàn),GC的動(dòng)作比較頻繁,但無(wú)法找到原因,一次PLA偶然的發(fā)現(xiàn)了大量如log.debug(“memberId:” + member.getMemberId())代碼

原因分析

在代碼中發(fā)現(xiàn)如下代碼段很多: log.debug(“memberId:” + member.getMemberId())

以上代碼執(zhí)行時(shí),分兩步:

  • 先執(zhí)行的是括號(hào)中的字符串相”+”的動(dòng)作,而每次”+”運(yùn)算都會(huì)導(dǎo)致新字符串的生成,這樣就產(chǎn)生了很多“中間字符串”,在極大次數(shù)被調(diào)用時(shí),這種字符串被創(chuàng)建和銷(xiāo)毀的數(shù)量非常龐大,從而造成了jvm gc頻繁執(zhí)行,進(jìn)而影響了性能。
  • 再執(zhí)行l(wèi)og.debug()函數(shù),在生產(chǎn)環(huán)境log level一般大于info,所以實(shí)際不會(huì)打印debug信息綜上所述,這些代碼在生產(chǎn)環(huán)境不會(huì)產(chǎn)生日志,但會(huì)執(zhí)行字符串”+”運(yùn)算,而這些運(yùn)算是無(wú)意義的,所以需要先判斷日志的優(yōu)先級(jí),方式是log.isXXXEnabled() { log.XXX(……); }

Log Level的級(jí)別: Fatal->error->warn->info->debug,級(jí)別從高到低 一般我們生成環(huán)境的log level都是error,所以對(duì)于Error以上級(jí)別的日志,不用判斷;對(duì)于error以下級(jí)別的都要加上判斷。

總結(jié)

is 判斷還是有必要的,目前沒(méi)什么別的辦法,我在寫(xiě)一個(gè)idea 插件,來(lái)一個(gè)按鈕/快捷鍵 自動(dòng)添加log if判斷,正好玩玩

后續(xù)

行吧,既然說(shuō)了做一個(gè)idea 插件,搞起來(lái),周末花了幾個(gè)小時(shí)搞了一版,提交了idea 審核 ,等待審核中 起名叫java-tools 開(kāi)發(fā)會(huì)用的功能 我會(huì)迭代進(jìn)去,有什么是你們需要的可以評(píng)論下,我會(huì)排下優(yōu)先級(jí) 開(kāi)發(fā)

簡(jiǎn)單效果:

@Slf4j
public class A {
    public void a(){
        log.info("21") ;
    }
}

點(diǎn)擊 ctrl + 8 一起按 或者 右鍵

變?yōu)?/p>

@Slf4j
public class A {
    public void a(){
        if(log. isInfoEnabled()){
        log. info("21");
        }
    }
}

以上就是java log is判斷引發(fā)的一系列事件解析的詳細(xì)內(nèi)容,更多關(guān)于log is判斷引發(fā)事件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于springboot集成阿里云短信的問(wèn)題

    關(guān)于springboot集成阿里云短信的問(wèn)題

    這篇文章主要介紹了springboot集成阿里云短信的方法,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • 解決IDEA占用C盤(pán)空間過(guò)大的問(wèn)題

    解決IDEA占用C盤(pán)空間過(guò)大的問(wèn)題

    這篇文章主要介紹了解決IDEA占用C盤(pán)空間過(guò)大的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java獲取網(wǎng)絡(luò)文件并插入數(shù)據(jù)庫(kù)的代碼

    Java獲取網(wǎng)絡(luò)文件并插入數(shù)據(jù)庫(kù)的代碼

    抓取各大網(wǎng)站的數(shù)據(jù)插入數(shù)據(jù)庫(kù),這樣就不用為沒(méi)有數(shù)據(jù)而煩惱了
    2010-06-06
  • SpringBoot整合MyBatisPlus詳解

    SpringBoot整合MyBatisPlus詳解

    這篇文章詳細(xì)介紹了SpringBoot整合mybatisplus的全過(guò)程,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2023-04-04
  • SpringCloud使用Feign實(shí)現(xiàn)服務(wù)調(diào)用

    SpringCloud使用Feign實(shí)現(xiàn)服務(wù)調(diào)用

    這篇文章主要為大家詳細(xì)介紹了SpringCloud使用Feign實(shí)現(xiàn)服務(wù)調(diào)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 詳解SpringMVC注解版前臺(tái)向后臺(tái)傳值的兩種方式

    詳解SpringMVC注解版前臺(tái)向后臺(tái)傳值的兩種方式

    本篇文章主要介紹了詳解SpringMVC注解版前臺(tái)向后臺(tái)傳值的兩種方式,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-04-04
  • Java?中的?clone(?)?和?new哪個(gè)效率更高

    Java?中的?clone(?)?和?new哪個(gè)效率更高

    很多朋友不太清楚clone()和new那個(gè)更快?針對(duì)這個(gè)問(wèn)題我百度了好多資料,最終小編總結(jié)下關(guān)于Java?中的?clone(?)?和?new哪個(gè)效率更高的問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • 詳解Mybatis 傳遞參數(shù)類(lèi)型為L(zhǎng)ist的取值問(wèn)題

    詳解Mybatis 傳遞參數(shù)類(lèi)型為L(zhǎng)ist的取值問(wèn)題

    這篇文章主要介紹了詳解Mybatis 傳遞參數(shù)類(lèi)型為L(zhǎng)ist的取值問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解Java中的ReentrantLock鎖

    詳解Java中的ReentrantLock鎖

    這篇文章主要介紹了Java中ReentrantLock鎖的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Java Management Extensions管理擴(kuò)展原理解析

    Java Management Extensions管理擴(kuò)展原理解析

    這篇文章主要介紹了Java Management Extensions管理擴(kuò)展原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

永修县| 吕梁市| 义马市| 仙桃市| 方山县| 石家庄市| 海林市| 汝阳县| 肇庆市| 乐东| 孟村| 富平县| 昌图县| 内乡县| 淮阳县| 浠水县| 开封县| 息烽县| 乾安县| 枣强县| 临澧县| 东明县| 安义县| 师宗县| 昌邑市| 黄陵县| 河曲县| 阳西县| 青龙| 密山市| 汝南县| 保山市| 迁西县| 南宁市| 古浪县| 许昌市| 什邡市| 兴城市| 清水河县| 华容县| 武穴市|