springboot日誌輸出到文件

今天來談一談日誌,主要是說一說springboot的日誌,因爲最近在學習springboot。首先在寫代碼的時候,要養成記日誌的習慣,這點真的很重要,因爲之前吃了很多虧。過去我對日誌很不在意,該有的日誌沒有,不該有的日誌卻隨意輸出。新換的工作,上司對日誌有嚴格的要求,也就慢慢開始注意了。

一般而言,一個接口或者說一段程序,其入口要有日誌,記錄傳入的數據是什麼;部分重要的處理邏輯要有日誌輸出;程序出口也要有日誌,記錄其最終的處理結果。這樣在解決生產上的問題時,可以很快的定位問題的位置,是傳入數據的問題還是我們代碼邏輯寫錯了,總比憑空想象的好,要相信計算機,日誌是不會騙人的。

還有一點,在生產上嚴禁使用System.out輸出,性能太低,原因是System.out輸出會導致線程等待(同步),而使用Logger輸出線程不等待日誌的輸出(異步),而繼續執行。

接下來看一看springboot的日誌配置,說一下把日誌記錄到文件中的配置方式。

工具/原料

  • springboot

  • 日誌

方法/步驟

  1. springboot推薦的日誌類庫是slf4j、日誌系統爲logback,確實我回頭一看項目中使用的都是slf4j,說明這個東西確實有他的優點。

    上文中也說了一點,slf4j有個接口叫Logger,提供了豐富的日誌輸出方法,包含了所有日誌級別的輸出。使用方式也是特別的簡單,用slf4j的工廠類獲取一個logger ,然後就可以輸出日誌了,默認情況下,日誌只會輸出到控制檯。

  2. 通過在application.properties文件中配置logging.file、logging.path可以控制日誌文件的輸出路徑和文件名。

    不過有些細節需要注意,否則配置不生效,我測試了幾種情況。

  3. 如果,兩者都配置了:logging.file=myLog.log、logging.path=D:/data/mylog,注意windos的路徑(後面配置文件中也是/),此時並不會在d盤下生成日誌文件,只會在項目的根目錄下創建一個myLog.log的文件(workspace中,此項目的根目錄)。

    其原因是,沒有logback-spring.xml配置文件,系統只認識logging.file,不認識logging.path。

  4. 所以要配置logback-spring.xml,spring boot會默認加載此文件,爲什麼不配置logback.xml,因爲logback.xml會先application.properties加載,而logback-spring.xml會後於application.properties加載,這樣我們在application.properties文中設置日誌文件名稱和文件路徑才能生效。

  5. 且看logback-spring.xml的配置詳情。注意${LOG_PATH}和${LOG_FILE}分別是獲取配置文件中的路徑和文件名稱,必須使用這兩個全局的配置去獲取。然後重啓項目,發現在配置的目錄下,有了相應的日誌文件。

     

  6. 日誌文件的配置結構:

    (1)FILE_LOG_PATTERN:日誌輸出格式變量,在控制檯輸出和文件中輸出的append中都引用了此變量。(2)consoleLog:定義一個控制檯的appender(3)fileLog:定義一個日誌文件的appender,這就是文件輸出的詳細配置,<File>是日誌文件的輸出地址:必須要爲${LOG_PATH}/${LOG_FILE},這樣我們在application.properties中的配置纔有效。level標籤:如果我們設置了level爲info,只會輸出info的日誌信息,其他日誌級別的日誌就會過濾掉,建議不配置level屬性。

    (4)logger:其name就是項目中對應的包路徑,appender-ref是appender的引用,在本配置文件中,意思就是com.example.xyx.MySpringBootTest包下文件的日誌,按照fileLog的配置去輸出,即按照FILE_LOG_PATTERN的格式,輸出到D:/data/mylog/myLog.log文件中。

    標籤level="debug"是設置日誌級別:作用是debug級別及其以上級別的日誌會輸出(debug、info、warn、error,,,),注意此處的level是一個下線,比其日誌級別高的日誌信息也會輸出,很重要。

    additivity="false"是配置此logger是否提交給其他的logger或者root節點,如果true,則root也會執行或者其他的可以攔截到的logger節點,且logger的level優先級高;否則不會執行,在本配置文件中即控制檯不會輸出com.example.xyx.MySpringBootTest包下文件的日誌。

    (5)root:根節點,在logback-spring.xml中只引用了控制檯日誌輸出配置,不會輸出到文件,如果想輸出到文件,可以寫再寫一個引用。level=info,在控制檯輸出into級別及其以上級別的日誌。會攔截所有包下的日誌,但是其輸出會受到logger的影響,即注意logger中的additivity屬性,如果爲false,com.example.xyx.MySpringBootTest包下的日誌不會輸出到控制檯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章