說說Java日誌

 

本文首發於我的微信公衆號《andyqian》,期待你的關注

前言

咱們在編寫代碼時,都知道在關鍵算法,邏輯性較強的地方添加註釋。一來提升了代碼的可維護性。二來讓代碼有了自可讀性。若是咱們把註釋理解爲靜態的自可讀性。那麼,程序在運行時,咱們如何才能知道程序的實際運行路徑呢?這就是今天的主角--日誌!算法

爲何要打日誌?

有不少朋友,不太喜歡打日誌。好幾百,甚至上千行的代碼。啪,啪,啪的全寫完!自信滿滿,一行日誌也沒打。聯調,測試,上線都沒問題。系統運行一段時間後,莫名的出現問題。那麼,究竟是哪一個地方出現問題了?方法的入參是什麼?系統走到哪一步了?一無所知。這下就只剩抓瞎了。從這裏咱們應該能夠看出,打日誌是很是有必要的。咱們梳理一下,打日誌有諸多好處。api

  1. 最直接的好處就是方便解決BUG了。
  2. 記錄請求的耗時時間,特別是接入第三方供應商時,調用遠程服務時,咱們能夠經過日誌來記錄請求的耗時時間。
  3. 對關鍵業務,關鍵算法的入參,以及結果打點並記錄下來。

最後: 記錄日誌是給本身分析問題,解決bug用的。咱們儘可能記錄的儘量簡潔,易懂以及清晰,理想狀況下甚至能經過日誌還原一次請求,一次調用的全過程。服務器

如何打日誌?

上面咱們說了爲何須要打日誌。如今咱們說說,如何打日誌。以咱們最經常使用slf4j這個日誌組件來講,它對應的日誌級別有: trace, debug,info,warn,error這五個日誌級別。其範圍依次爲: error>warn>info>debug>trace。微信

咱們在平常開發中:框架

  1. 在開發初期,咱們能夠在進入方法時用info模式的日誌級別,記錄方法的入,出參。在遠程方法調用前,調用後,使用info級別。記錄遠程方法的耗時。在try{}catch處,使用error級別日誌級別,記錄信息。以方便用來快速查找,以及分析問題。
  2. 服務運行穩定一段時間後,咱們能夠將必須記錄的參數,修改成warn級別。日誌級別設置爲warn。也就是說,只顯示warn和error級別中的日誌。(有不少公司,都以error級別的日誌做爲報警信息,發送給對應的應用負責人。)
  3. 在生產環境中,禁止啓用debug級別的日誌。由於debug級別的日誌會顯示不少不必的日誌。這樣很容易形成服務器資源浪費。嚴重時甚至形成服務器撐滿。直接致使服務不可用。
  4. 凡事都是物極必反。一樣的,日誌也不是越多越好,過多的打印日誌,一樣的也會形成服務性能降低。甚至形成服務器壓力過大。直接影響服務的可用性。
  5. 咱們能夠經過以下形式來記錄日誌:

以log4j+slf4j-api爲例:性能

pom.xml依賴:單元測試

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.25</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.25</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

如下打日誌例子:測試

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class LogTest {

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


    @Test
   public void testLog(){
        String name="andyqian";
        String blog = "www.andyqian.com";
        //就日誌
        logger.debug("name: {} and blog : {} ", name, blog);
    }
}

咱們經過佔位符的形式,記錄日誌。不建議使用字符串拼接的形式來記錄日誌。spa

經常使用Java日誌框架

在Java中,常見的日誌框架有.net

  1. JDK自帶的JDK Logger。
  2. Apche commons Logging。
  3. Apache log4j。
  4. Slf4j ( Simple Logging Facade for Java)
  5. Logback
  6. Apache log4j 2 (這實際上是Apache log4j的升級版本。在log4j的基礎上,性能有進一步的提升。)

在平常的開發中,咱們一般都是經過Slf4j+的實現。以上述案例中,咱們就說到了(slf4j+log4j的形式)。在實際使用中,咱們也能夠經過slf4j+ logback日誌的形式作爲日誌組合。

ps:各個日誌框架的性能不在本文討論之中。有興趣的童鞋,可自行測試。

小結

有好幾天沒有寫文章了,手有點生。閒暇時翻翻本身記錄下來的文章,就像光着腳丫在沙灘上奔跑了許久後,時而回頭還能看到被海水沖淡的腳印同樣。也以爲挺有意思!

相關閱讀:

你該瞭解的Java註釋

說說單元測試

一個Java細節

初探JDK源碼之字符集

 

這裏寫圖片描述

 掃碼關注,一塊兒進步

我的博客: http://www.andyqian.com

相關文章
相關標籤/搜索