国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java日志正確使用姿勢

UCloud / 960人閱讀

摘要:但是往往越簡單的東西越容易讓我們忽視,從而導致一些不該有的發生,作為一名嚴謹的程序員,怎么能讓這種事情發生呢所以下面我們就來了解一下關于日志的那些正確使用姿勢。級別表示出現了嚴重錯誤,程序將會中斷執行。

前言

關于日志,在大家的印象中都是比較簡單的,只須引入了相關依賴包,剩下的事情就是在項目中“盡情”的打印我們需要的信息了。但是往往越簡單的東西越容易讓我們忽視,從而導致一些不該有的bug發生,作為一名嚴謹的程序員,怎么能讓這種事情發生呢?所以下面我們就來了解一下關于日志的那些正確使用姿勢。

正文
日志規范
命名

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

保存時間

關于日志保存的時間,普通的日志文件建議保留15天,若比較重要的可根據實際情況延長,具體請參考各自服務器磁盤空間以及日志文件大小作出最優選擇。

日志級別

常見的日志級別有以下:

DEBUG級別:記錄調試程序相關的信息。

INFO級別:記錄程序正常運行有意義的信息。

WARN級別:記錄可能會出現潛在錯誤的信息。

ERROR級別:記錄當前程序出錯的信息,需要被關注處理。

Fatal級別:表示出現了嚴重錯誤,程序將會中斷執行。

建議在項目中使用這四種級別, ERROR、WARN、INFO 、DEBUG。

正確姿勢

1、提前判斷日志級別

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

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

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

2、避免多余日志輸出

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

那么這時候該學會使用additivity屬性

在這邊配置成true的話,也就是默認的情況,這時候當前Logger會繼承父Logger的Appender,說白了就是當前日志的輸出除了輸出在當前日志文件以外,還會輸出至父文件里。所以一般情況下,我們為了避免重復打印,會將這個參數設置成false,以減少不必要的輸出。

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

在我們的代碼中,日志記錄的內容要包含異常的堆棧,請勿隨意輸出“XX出錯”等簡單的日志,這對于錯誤的調試毫無幫助。所以我們在記錄異常的時候一定要帶上堆棧信息,例如

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

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

4、定義logger變量為static

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

確保一個對象只使用一個Logger對象,避免每次都重新創建,否則可能會導致OOM。

5、正確使用日志級別

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

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

6、推薦使用slf4j+logback組合

logback庫里自身就已經實現了slf4j的接口,就無需引入多余的適配器了,而且logback也具有更多的優點,建議新項目可以使用這個組合。
還有一點需要注意,當引入slf4j后,要注意其實際使用的日志庫是否是由我們引入的,也有可能會使用了我們第三方依賴包所帶入的日志庫,這樣就可能會導致我們的日志失效。

7、日志的聚合分析

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

拿ELK來說,可以在我們的服務器上直接通過logstash來讀取應用打印的日志文件,或者也可以在我們項目中的日志配置文件里配置好相關的socket信息,打印的時候直接把日志信息輸出至logstash。再交由elasticsearch存儲,kibana展示。

結語

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

公眾號博文同步Github倉庫,有興趣的朋友可以幫忙給個Star哦,碼字不易,感謝支持。

https://github.com/PeppaLittl...

推薦閱讀

《使用ConcurrentHashMap一定線程安全嗎?》
《大白話搞懂什么是同步/異步/阻塞/非阻塞》
《Java異常處理最佳實踐及陷阱防范》
《論JVM爆炸的幾種姿勢及自救方法》

有收獲的話,就點個贊吧

關注公眾號「深夜里的程序猿」,分享最干的干貨

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77652.html

相關文章

  • Sentry - 處理異常日志正確姿勢

    摘要:對我們來說最大的便利就是利用日志進行錯誤發現和排查的效率變高了。官方也提倡正確設置接收的日志的同時,用戶也能繼續舊的日志備份。 在各種系統和應用里,無論你的代碼再完美也還是會拋異常,出錯誤。今天的主角是當今比較流行的異常記錄框架 - Sentry,來了解一下。 關于日志管理 應用越做越復雜,輸出日志五花八門,有print的,有寫stdout的,有寫stderr的, 有寫logging的...

    lifefriend_007 評論0 收藏0
  • 使用Java Exception機制的正確姿勢

    摘要:如何良好的在代碼中設計異常機制本身設計的出發點是極好的,通過編譯器的強制捕獲,可以明確提醒調用者處理異常情況。但使用此種異常后,該會像病毒一樣,得不到處理后會污染大量代碼,同時也可能因為調用者的不當處理,會失去異常信息。 1、異常是什么? 父類為Throwable,有Error和Exception兩個子類 Error為系統級別的異常(錯誤) Exception下有眾多子類,常見的有Ru...

    Astrian 評論0 收藏0

發表評論

0條評論

UCloud

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<