1. 程式人生 > >Spring Boot 2.X(十四):日誌功能 Logback

Spring Boot 2.X(十四):日誌功能 Logback

Logback 簡介

Logback 是由 SLF4J 作者開發的新一代日誌框架,用於替代 log4j。

主要特點是效率更高,架構設計夠通用,適用於不同的環境。

Logback 分為三個模組:logback-core,logback-classic和logback-access。

logback-core 模組是其他兩個模組的基礎。

logback-classic 模組是 core 的擴充套件,是log4j的改進版。logback-classic 本身實現了 SLF4J API,因此可以很容易的在 logback 和其他日誌框架之間來回切換,例如 log4j、java.util.logging(JUL)。

logback-access 模組集成了 Servlet 容器,提供了 HTTP 訪問日誌的功能。

官網:http://logback.qos.ch

中文網:http://www.logback.cn

github:https://github.com/qos-ch/logback

Logback 使用

1.使用 logback-spring.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設定為WARN,則低於WARN的資訊都不會輸出 -->
<!-- scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。 -->
<!-- scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。 -->
<!-- debug:當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 定義日誌根目錄 -->
    <property name="LOG_PATH" value="/usr/local/log/" />
    <!-- 定義應用名稱 -->
    <property name="APP_NAME" value="springboot-logback" />
    <!-- 應用名稱 -->
    <contextName>${APP_NAME}</contextName>
    <!-- 引用 Spring Boot 中預設的 logback 配置 -->
    <!-- <include resource="org/springframework/boot/logging/logback/base.xml" /> -->
    <!-- 可以動態修改日誌輸出等級 -->
    <jmxConfigurator />
        
     <!--輸出到控制檯-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日誌appender是為開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌資訊-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <pattern>%d [%t] %5p %c:%L - %m%n</pattern>
            <!-- 設定字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- 時間滾動輸出 level為 INFO 日誌 -->
    <appender name="INFO_FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}${APP_NAME}-info.log</File>
        <encoder>
            <pattern>%d [%t] %5p %c:%L - %m%n</pattern>
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄,日誌按天分類壓縮儲存-->
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <FileNamePattern>${LOG_PATH}${APP_NAME}/info/%d{yyyy-MM-dd}-%i.log.gz
            </FileNamePattern>
             <!--日誌檔案保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    </appender>
    <!-- 時間滾動輸出 level為 ERROR 日誌 -->
    <appender name="ERROR_FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}${APP_NAME}-error.log</File>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>error</level>
        </filter>
        <encoder>
            <pattern>%d [%t] %5p %c:%L - %m%n</pattern>
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄,日誌按天分類壓縮儲存-->
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>256MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <FileNamePattern>${LOG_PATH}${APP_NAME}/error/%d{yyyy-MM-dd}-%i.log.gz
            </FileNamePattern>
             <!--日誌檔案保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
    </appender>
    <!-- 設定需要列印日誌的包及輸出級別 -->
    <logger name="org.springframework.web" level="INFO" />
    <logger name="cn.zwqh.springboot.controller" level="TRACE" />
    <!--
        使用mybatis的時候,sql語句只有在 debug 級別下才會列印
     -->
    <logger name="cn.zwqh.springboot.dao" level="debug" />

    <!--
        root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性
        level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能設定為INHERITED或者同義詞NULL。預設是DEBUG
        可以包含零個或多個元素,標識這個appender將會新增到這個logger。
    -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

2.使用 logback.groovy 配置

使用 groovy 配置需要新增依賴

 <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.17</version>
        </dependency>
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.classic.filter.ThresholdFilter
import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.rolling.RollingFileAppender
import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
import java.nio.charset.Charset

import static ch.qos.logback.classic.Level.DEBUG
import static ch.qos.logback.classic.Level.ERROR
import static ch.qos.logback.classic.Level.INFO
import static ch.qos.logback.classic.Level.TRACE

scan("60 seconds")
def LOG_PATH = "/usr/local/log/"
def APP_NAME = "springboot-logback"
context.name = "${APP_NAME}"
jmxConfigurator()
appender("CONSOLE", ConsoleAppender) {
  filter(ThresholdFilter) {
    level = DEBUG
  }
  encoder(PatternLayoutEncoder) {
    pattern = "%d [%t] %5p %c:%L - %m%n"
    charset = Charset.forName("UTF-8")
  }
}
appender("INFO_FILE", RollingFileAppender) {
  file = "${LOG_PATH}${APP_NAME}-info.log"
  encoder(PatternLayoutEncoder) {
    pattern = "%d [%t] %5p %c:%L - %m%n"
    charset = Charset.forName("UTF-8")
  }
  rollingPolicy(TimeBasedRollingPolicy) {
    timeBasedFileNamingAndTriggeringPolicy(SizeAndTimeBasedFNATP) {
      maxFileSize = "100MB"
    }
    fileNamePattern = "${LOG_PATH}${APP_NAME}/info/%d{yyyy-MM-dd}-%i.log.gz"
    maxHistory = 30
  }
}
appender("ERROR_FILE", RollingFileAppender) {
  file = "${LOG_PATH}${APP_NAME}-error.log"
  filter(ThresholdFilter) {
    level = ERROR
  }
  encoder(PatternLayoutEncoder) {
    pattern = "%d [%t] %5p %c:%L - %m%n"
    charset = Charset.forName("UTF-8")
  }
  rollingPolicy(TimeBasedRollingPolicy) {
    timeBasedFileNamingAndTriggeringPolicy(SizeAndTimeBasedFNATP) {
      maxFileSize = "256MB"
    }
    fileNamePattern = "${LOG_PATH}${APP_NAME}/error/%d{yyyy-MM-dd}-%i.log.gz"
    maxHistory = 30
  }
}
logger("org.springframework.web", INFO)
logger("cn.zwqh.springboot.controller", TRACE)
logger("cn.zwqh.springboot.dao", DEBUG)
root(INFO, ["CONSOLE", "INFO_FILE", "ERROR_FILE"])

詳細的 logback.groovy 語法可以參考 http://logback.qos.ch/manual/groovy.html 。logback 也提供了 logback.xml 轉 logback.groovy 的線上工具,地址:http://logback.qos.ch/translator/asGroovy.html (include 標籤未作解析,所以轉換前把該標籤去除,否則會報錯)

logback.xml 配置說明

configuration

配置檔案的根節點,主要包含以下三個屬性:

  • scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
  • scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
  • debug:當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。

contextName

設定日誌上下文名稱,後面輸出格式中可以通過定義 %contextName 來列印日誌上下文名稱。

property

配置檔案的變數定義,name 代表變數的名稱,value 代表變數定義的值。通過定義的值會被插入到logger上下文中。定義變數後,可以使“${name}”來使用變數。

jmxConfigurator

開啟 JMX 的功能,可以從預設配置檔案,指定檔案或URL重新配置登入,列出記錄器並修改記錄器級別。

JMX(Java Management Extensions,即 Java 管理擴充套件)是一個為應用程式、裝置、系統等植入管理功能的框架。JMX 可以跨越一系列異構作業系統平臺、系統體系結構和網路傳輸協議,靈活的開發無縫整合的系統、網路和服務管理應用。相關文件:http://logback.qos.ch/manual/jmxConfig.html

appender

日誌輸出元件,主要負責日誌的輸出以及格式化日誌。常用的屬性有name和class。

  • name:appender元件的名稱,後面給logger指定appender使用。
  • class:appender的具體實現類。常用的有 ConsoleAppender、FileAppender、RollingFileAppender。

appender的具體實現類:

  • ConsoleAppender:向控制檯輸出日誌內容的元件,只要定義好encoder節點就可以使用。
  • FileAppender:向檔案輸出日誌內容的元件,用法也很簡單,不過由於沒有日誌滾動策略,一般很少使用。
  • RollingFileAppender:向檔案輸出日誌內容的元件,同時可以配置日誌檔案滾動策略,在日誌達到一定條件後生成一個新的日誌檔案。

Threshold filter

Logback 定義的日誌列印級別的過濾器。可以過濾掉指定級別以下的日誌不輸出到檔案。

encoder charset

表示對日誌進行編碼。

encoder pattern

  • %d{HH:mm:ss.SSS} —— 日誌輸出時間。
  • %thread —— 輸出日誌的程序名稱,用方括號括起來。這個資訊在 Web 應用以及非同步任務處理中很有用。
  • %-5level —— 日誌級別,使用5個字元靠左對齊。
  • %logger{36} —— 日誌輸出者的名字。
  • %msg —— 日誌訊息。
  • %n —— 換行符。

rollingPolicy

日誌記錄器的滾動策略。

  • FileNamePattern:定義日誌的切分方式,本文把每一天的日誌歸檔到一個檔案。
  • MaxHistory:表示日誌保留的天數,本文設定為30天。

logger

用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定

  • name:用來指定受此logger約束的某一個包或者具體的某一個類。
  • level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設定此屬性,那麼當前logger將會繼承上級的級別。

使用mybatis的時候,sql語句只有在 debug 級別下才會列印

root

必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性
level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設定為INHERITED或者同義詞NULL。預設是 DEBUG 可以包含零個或多個元素,標識這個appender將會新增到這個logger。

示例程式碼

github

碼雲

非特殊說明,本文版權歸 朝霧輕寒 所有,轉載請註明出處.

原文標題:Spring Boot 2.X(十四):日誌功能 Logback

原文地址:https://www.zwqh.top/article/info/23

如果文章對您有幫助,請掃碼關注下我的公眾號,文章持續更新中...

相關推薦

Spring Boot 2.X()日誌功能 Logback

Logback 簡介 Logback 是由 SLF4J 作者開發的新一代日誌框架,用於替代 log4j。 主要特點是效率更高,架構設計夠通用,適用於不同的環境。 Logback 分為三個模組:logback-core,logback-classic和logback-access。 logback-core 模

Spring Boot 2.X(一)全域性異常處理

前言 在 Java Web 系統開發中,不管是 Controller 層、Service 層還是 Dao 層,都有可能丟擲異常。如果在每個方法中加上各種 try catch 的異常處理程式碼,那樣會使程式碼非常繁瑣。在Spring MVC 中,我們可以將所有型別的異常處理從各個單獨的方法中解耦出來,進行異常資

Spring Boot 2.X(二)定時任務

簡介 定時任務是後端開發中常見的需求,主要應用場景有定期資料報表、定時訊息通知、非同步的後臺業務邏輯處理、日誌分析處理、垃圾資料清理、定時更新快取等等。 Spring Boot 集成了一整套的定時任務工具,讓我們專注於完成邏輯,剩下的基礎排程工作將自動完成。 通用實現方式 實現方式 描述 jav

Spring Boot 2.X(五)整合 Swagger2 開發 API 文件(線上+離線)

前言 相信很多後端開發在專案中都會碰到要寫 api 文件,不管是給前端、移動端等提供更好的對接,還是以後為了以後交接方便,都會要求寫 api 文件。 而手寫 api 文件的話有諸多痛點: 文件更新的時候,需要再次傳送給對接人 介面太對,手寫文件很難管理 介面返回的結果不明確 不能直接線上測試介面,通常需要使

Spring Boot 2.X(六)應用監控之 Spring Boot Actuator 使用及配置

Actuator 簡介 Actuator 是 Spring Boot 提供的對應用系統的自省和監控功能。通過 Actuator,可以使用資料化的指標去度量應用的執行情況,比如檢視伺服器的磁碟、記憶體、CPU等資訊,系統的執行緒、gc、執行狀態等等。 Actuator 通常通過使用 HTTP 和 JMX 來管理

Spring Boot 2.X(八)整合 Spring Security-登入認證和許可權控制

前言 在企業專案開發中,對系統的安全和許可權控制往往是必需的,常見的安全框架有 Spring Security、Apache Shiro 等。本文主要簡單介紹一下 Spring Security,再通過 Spring Boot 整合開一個簡單的示例。 Spring Security 什麼是 Spring Se

Spring Boot 2.x整合Mybatis的種方式

前言 目前的大環境下,使用Mybatis作為持久層框架還是佔了絕大多數的,下面我們來說一下使用Mybatis的幾種姿勢。 姿勢一:

Spring Boot 2.X()自定義註冊 Servlet、Filter、Listener

前言 在 Spring Boot 中已經移除了 web.xml 檔案,如果需要註冊新增 Servlet、Filter、Listener 為 Spring Bean,在 Spring Boot 中有兩種方式: 使用 Servlet 3.0 API 的註解 @WebServlet、@WebFilter、@Lis

Spring Boot 2.x基礎教程快速入門

開發十年,就只剩下這套架構體系了! >>>   

Spring Boot 2.x基礎教程工程結構推薦

Spring Boot框架本身並沒有對工程結構有特別的要求,但是按照最佳實踐的工程結構可以幫助我們減少可能會遇見的坑,尤其是Spr

Spring Boot 2.x基礎教程構建RESTful API與單元測試

首先,回顧並詳細說明一下在快速入門中使用的@Controller、@RestController、@RequestMapping註

Spring Boot 2.x基礎教程使用Swagger2構建強大的API文件

隨著前後端分離架構和微服務架構的流行,我們使用Spring Boot來構建RESTful API專案的場景越來越多。通常我們的一個RESTful API就有可能要服務於多個不同的開發人員或開發團隊:IOS開發、Android開發、Web開發甚至其他的後端服務等。為了減少與其他團隊平時開發期間的頻繁溝通成本,傳

Spring Boot 2.x基礎教程JSR-303實現請求引數校驗

請求引數的校驗是很多新手開發非常容易犯錯,或存在較多改進點的常見場景。比較常見的問題主要表現在以下幾個方面: 僅依靠前端框架解決引數校驗,缺失服務端的校驗。這種情況常見於需要同時開發前後端的時候,雖然程式的正常使用不會有問題,但是開發者忽略了非正常操作。比如繞過前端程式,直接模擬客戶端請求,這時候就會突然在

Spring Boot 2.x基礎教程Swagger介面分類與各元素排序問題詳解

之前通過Spring Boot 2.x基礎教程:使用Swagger2構建強大的API文件一文,我們學習瞭如何使用Swagger為Spring Boot專案自動生成API文件,有不少使用者留言問了關於文件內容的組織以及排序問題。所以,就特別開一篇詳細說說Swagger中文件內容如何來組織以及其中各個元素如何控制

Spring Boot 2.x 基礎案例整合Dubbo 2.7.3+Nacos1.1.3(最新版)

1、概述 本文將介紹如何基於Spring Boot 2.x的版本,通過Nacos作為配置與註冊中心,實現Dubbo服務的註冊與消費。 整合元件的版本說明: Spring Boot 2.1.9 Dubbo 2.7.3 Nacos 1.1.3 本文的亮點: 1.採用yml方式進行dubbo的配置。 2.

Spring Boot 2.x 基礎案例整合Dubbo 2.7.3+Nacos1.1.3(配置中心)

本文原創首發於公眾號:Java技術乾貨 1、概述 本文將Nacos作為配置中心,實現配置外部化,動態更新。這樣做的優點:不需要重啟應用,便可以動態更新應用裡的配置資訊。在如今流行的微服務應用下,將應用的配置統一管理,顯得尤為重要。 上一篇寫了《Spring Boot 2.x 基礎案例:整合Dubbo

Spring Boot 2.x基礎教程Swagger靜態文件的生成

前言 通過之前的兩篇關於Swagger入門以及具體使用細節的介紹之後,我們已經能夠輕鬆地為Spring MVC的Web專案自動構建出API文件了。如果您還不熟悉這塊,可以先閱讀: Spring Boot 2.x基礎教程:使用Swagger2構建強大的API文件 Spring Boot 2.x基礎教程:Swa

Spring Boot 2.x基礎教程使用JdbcTemplate訪問MySQL資料庫

在第2章節中,我們介紹瞭如何通過Spring Boot來實現HTTP介面,以及圍繞HTTP介面相關的單元測試、文件生成等實用技能。但是,這些內容還不足以幫助我們構建一個動態應用的服務端程式。不論我們是要做App、小程式、還是傳統的Web站點,對於使用者的資訊、相關業務的內容,通常都需要對其進行儲存,而不是像第

Spring Boot 2.x基礎教程預設資料來源Hikari的配置詳解

通過上一節的學習,我們已經學會如何應用Spring中的JdbcTemplate來完成對MySQL的資料庫讀寫操作。接下來通過本篇文章,重點說說在訪問資料庫過程中的一個重要概念:資料來源(Data Source),以及Spring Boot中對資料來源的建立與配置。 基本概念 在開始說明Spring Boot中

Spring Boot 2.x基礎教程使用國產資料庫連線池Druid

上一節,我們介紹了Spring Boot在JDBC模組中自動化配置使用的預設資料來源HikariCP。接下來這一節,我們將介紹另外一個被廣泛應用的開源資料來源:Druid。 Druid是由阿里巴巴資料庫事業部出品的開源專案。它除了是一個高效能資料庫連線池之外,更是一個自帶監控的資料庫連線池。雖然HikariC