欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java日志正確使用姿勢(shì)

 更新時(shí)間:2019年04月23日 08:34:01   作者:深夜里的程序猿  
這篇文章主要介紹了Java日志正確使用姿勢(shì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

關(guān)于日志,在大家的印象中都是比較簡(jiǎn)單的,只須引入了相關(guān)依賴包,剩下的事情就是在項(xiàng)目中“盡情”的打印我們需要的信息了。但是往往越簡(jiǎn)單的東西越容易讓我們忽視,從而導(dǎo)致一些不該有的bug發(fā)生,作為一名嚴(yán)謹(jǐn)?shù)某绦騿T,怎么能讓這種事情發(fā)生呢?所以下面我們就來了解一下關(guān)于日志的那些正確使用姿勢(shì)。

正文

日志規(guī)范

命名

首先是日志文件的命名,盡量要做到見名知意,團(tuán)隊(duì)里面也必須使用統(tǒng)一的命名規(guī)范,不然“臟亂差”的日志文件會(huì)影響大家排查問題的效率。這里推薦以“projectName_logName_logType.log”來命名,這樣通過名字就可以清晰的知道該日志文件是屬于哪個(gè)項(xiàng)目,什么類型,有什么作用。例如在我們MessageServer項(xiàng)目中監(jiān)控Rabbitmq 消費(fèi)者相關(guān)的日志文件名可以定義成“messageserver_rabbitmqconsumer_monitor.log”。

保存時(shí)間

關(guān)于日志保存的時(shí)間,普通的日志文件建議保留15天,若比較重要的可根據(jù)實(shí)際情況延長(zhǎng),具體請(qǐng)參考各自服務(wù)器磁盤空間以及日志文件大小作出最優(yōu)選擇。

日志級(jí)別

常見的日志級(jí)別有以下:

  1. DEBUG級(jí)別:記錄調(diào)試程序相關(guān)的信息。
  2. INFO級(jí)別:記錄程序正常運(yùn)行有意義的信息。
  3. WARN級(jí)別:記錄可能會(huì)出現(xiàn)潛在錯(cuò)誤的信息。
  4. ERROR級(jí)別:記錄當(dāng)前程序出錯(cuò)的信息,需要被關(guān)注處理。
  5. Fatal級(jí)別:表示出現(xiàn)了嚴(yán)重錯(cuò)誤,程序?qū)?huì)中斷執(zhí)行。

建議在項(xiàng)目中使用這四種級(jí)別, ERROR、WARN、INFO 、DEBUG。

正確姿勢(shì)

1、提前判斷日志級(jí)別

//條件判斷
if(logger.isDebugEnabled){
  logger.debug("server info , id : " + id + ", user : " + user);
}

//使用占位符
logger.debug("server info , id : {}, user : {}",id,user);

對(duì)于DEBUG,INFO級(jí)別的日志,在我們的程序中是比較高頻的存在,當(dāng)我們的項(xiàng)目大了,日志變多了,這時(shí)候?yàn)榱顺绦蜻\(yùn)行的效率,我們必須以條件判斷或者占位符的方式來打印日志。為什么呢?假如我們項(xiàng)目中配置的日志級(jí)別為WARN,那么對(duì)于我們下面的日志輸出語句‘ logger.debug("server info , id : " + id + ", user : " + user);',雖然該日志不會(huì)被打印,但是卻會(huì)執(zhí)行字符串拼接的操作,這里我們的user是一個(gè)實(shí)例對(duì)象,所以還會(huì)執(zhí)行toString方法,這樣就白白浪費(fèi)了不少系統(tǒng)的資源。

2、避免多余日志輸出

在我們的生產(chǎn)環(huán)境中,一般禁止DEBUG日志的輸出,其打印的頻率是非常高的,容易對(duì)正常運(yùn)行的程序造成嚴(yán)重的影響,在我們最近的項(xiàng)目中就有遇到過類似的情況。

那么這時(shí)候該學(xué)會(huì)使用additivity屬性

<logger name="xx" additivity="true">

在這邊配置成true的話,也就是默認(rèn)的情況,這時(shí)候當(dāng)前Logger會(huì)繼承父Logger的Appender,說白了就是當(dāng)前日志的輸出除了輸出在當(dāng)前日志文件以外,還會(huì)輸出至父文件里。所以一般情況下,我們?yōu)榱吮苊庵貜?fù)打印,會(huì)將這個(gè)參數(shù)設(shè)置成false,以減少不必要的輸出。

3、保證日志記錄信息完整

在我們的代碼中,日志記錄的內(nèi)容要包含異常的堆棧,請(qǐng)勿隨意輸出“XX出錯(cuò)”等簡(jiǎn)單的日志,這對(duì)于錯(cuò)誤的調(diào)試毫無幫助。所以我們?cè)谟涗洰惓5臅r(shí)候一定要帶上堆棧信息,例如

logger.error("rabbitmq consumer error,cause : "+e.getMessage(),e);

切記在輸出對(duì)象實(shí)例的時(shí)候,須確保對(duì)象重寫了toString方法,否則只會(huì)輸出其hashCode值。

4、定義logger變量為static

private static final Logger logger = LoggerFactory.getLogger(XX.class);

確保一個(gè)對(duì)象只使用一個(gè)Logger對(duì)象,避免每次都重新創(chuàng)建,否則可能會(huì)導(dǎo)致OOM。

5、正確使用日志級(jí)別

try{
  //..
}catch(xx){
  logger.info(..);
}

這樣一來,本來是ERROR的信息,全都打印在INFO日志文件里了,不知情的同事還會(huì)在死盯著錯(cuò)誤日志,而且還找不出問題,多影響工作效率是吧?

6、推薦使用slf4j+logback組合

logback庫里自身就已經(jīng)實(shí)現(xiàn)了slf4j的接口,就無需引入多余的適配器了,而且logback也具有更多的優(yōu)點(diǎn),建議新項(xiàng)目可以使用這個(gè)組合。
還有一點(diǎn)需要注意,當(dāng)引入slf4j后,要注意其實(shí)際使用的日志庫是否是由我們引入的,也有可能會(huì)使用了我們第三方依賴包所帶入的日志庫,這樣就可能會(huì)導(dǎo)致我們的日志失效。

7、日志的聚合分析

日志的聚合可以把位于不同服務(wù)器之間的日志統(tǒng)一起來分析處理,如今ELK技術(shù)棧亦或者的EFG(fluentd+elasticsearch+grafana)等都是一些比較成熟的開源解決方案。

拿ELK來說,可以在我們的服務(wù)器上直接通過logstash來讀取應(yīng)用打印的日志文件,或者也可以在我們項(xiàng)目中的日志配置文件里配置好相關(guān)的socket信息,打印的時(shí)候直接把日志信息輸出至logstash。再交由elasticsearch存儲(chǔ),kibana展示。

結(jié)語

好了,關(guān)于日志先聊這么多~ 大家有需要補(bǔ)充或者交流的可以在下方留言哦。

以上所述是小編給大家介紹的Java日志正確使用姿勢(shì)詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java設(shè)計(jì)模式之橋模式(Bridge模式)介紹

    Java設(shè)計(jì)模式之橋模式(Bridge模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之橋模式(Bridge模式)介紹,本文講解了為什么使用橋模式、如何實(shí)現(xiàn)橋模式、Bridge模式在EJB中的應(yīng)用等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • java異常級(jí)別與捕獲的示例代碼

    java異常級(jí)別與捕獲的示例代碼

    本次模擬一個(gè)異常實(shí)例,驗(yàn)證一下異常的捕獲,通過實(shí)例代碼給大家解析java異常級(jí)別與捕獲的操作方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • 探究springboot中的TomcatMetricsBinder

    探究springboot中的TomcatMetricsBinder

    springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后創(chuàng)建TomcatMetrics執(zhí)行bindTo進(jìn)行注冊(cè),TomcatMetrics主要注冊(cè)了globalRequest、servlet、cache、threadPool、session相關(guān)的指標(biāo),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-11-11
  • 基于注解的組件掃描詳解

    基于注解的組件掃描詳解

    這篇文章主要介紹了基于注解的組件掃描詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 一文帶你搞懂Java定時(shí)器Timer的使用

    一文帶你搞懂Java定時(shí)器Timer的使用

    定時(shí)器類似于我們生活中的鬧鐘,可以設(shè)定一個(gè)時(shí)間來提醒我們。而定時(shí)器是指定一個(gè)時(shí)間去執(zhí)行一個(gè)任務(wù),讓程序去代替人工準(zhǔn)時(shí)操作。本文就來聊聊Java定時(shí)器Timer的使用,需要的可以參考一下
    2023-01-01
  • mybatisplus的連表增強(qiáng)插件mybatis plus join

    mybatisplus的連表增強(qiáng)插件mybatis plus join

    本文主要介紹了mybatisplus的連表增強(qiáng)插件mybatis plus join,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot使用CORS實(shí)現(xiàn)無縫跨域的方法實(shí)現(xiàn)

    SpringBoot使用CORS實(shí)現(xiàn)無縫跨域的方法實(shí)現(xiàn)

    CORS 是一種在服務(wù)端設(shè)置響應(yīng)頭部信息的機(jī)制,允許特定的源進(jìn)行跨域訪問,本文主要介紹了SpringBoot使用CORS實(shí)現(xiàn)無縫跨域的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 新手初學(xué)Java對(duì)象內(nèi)存構(gòu)成

    新手初學(xué)Java對(duì)象內(nèi)存構(gòu)成

    這篇文章主要介紹了深入理解JVM之Java對(duì)象的創(chuàng)建、內(nèi)存布局、訪問定位,結(jié)合實(shí)例形式詳細(xì)分析了Java對(duì)象的創(chuàng)建、內(nèi)存布局、訪問定位相關(guān)概念、原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2021-07-07
  • Spring?Boot實(shí)現(xiàn)第一次啟動(dòng)時(shí)自動(dòng)初始化數(shù)據(jù)庫流程詳解

    Spring?Boot實(shí)現(xiàn)第一次啟動(dòng)時(shí)自動(dòng)初始化數(shù)據(jù)庫流程詳解

    在現(xiàn)在的后端開發(fā)中,只要是使用關(guān)系型數(shù)據(jù)庫,相信SSM架構(gòu)(Spring?Boot?+?MyBatis)已經(jīng)成為首選,本文就以Spring?Boot?+?MyBatis為例,使用MySQL作為數(shù)據(jù)庫,完成數(shù)據(jù)庫初始化功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • PowerMockito的基本使用解析

    PowerMockito的基本使用解析

    這篇文章主要介紹了PowerMockito的基本使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論