一篇文章帶你徹底搞懂Java日志與Logback
一、為什么需要日志?
在開發(fā)和運維一個系統(tǒng)時,我們經常會有這樣的需求:
- 想清楚地知道系統(tǒng)運行了哪些步驟
- 某個時間點系統(tǒng)發(fā)生了什么錯誤
- 用戶反饋“系統(tǒng)卡了/掛了”,希望能還原當時的現(xiàn)場
這時候就離不開:日志(Log)。
很多初學者一開始就是在代碼里到處寫 System.out.println(...) 來“打日志”。 這種方式雖然簡單,但有幾個明顯弊端:
1. 輸出語句的弊端
- 信息只能顯示在控制臺,關掉控制臺就什么都沒了
- 無法方便地記錄到文件、數據庫等其他位置
- 想“停用日志”或者“少打印點日志”,就得改代碼、重新打包、重新上線
對于一個真正的線上系統(tǒng),這些都是難以接受的。
2. 日志技術的優(yōu)勢
專業(yè)的日志框架能幫我們解決上述問題,它具備這些能力:
- 可以將系統(tǒng)執(zhí)行信息選擇性地記錄到:
- 控制臺
- 文件
- 數據庫(一般不推薦大量打到 DB,中間件會偶爾這么做)
- 可以通過配置文件來控制:
- 哪些日志記錄
- 記錄到哪里
- 以什么格式記錄
- 用什么級別(debug/info/warn/error)
- 可以通過“開關(級別設置)”來決定是否記錄日志,而無需修改源代碼
一句話:日志框架讓“日志”變成一種可配置、可控制的基礎設施。
二、日志體系:接口與實現(xiàn)
Java 生態(tài)中的日志并不是一個單一庫,而是一個分層體系,大致可以理解為兩類:
- 日志規(guī)范接口(Facade,門面)
- 日志實現(xiàn)框架(具體干活的)
1. 日志規(guī)范接口
常見的日志接口:
- Commons Logging (簡稱:JCL)
- Simple Logging Facade for Java (簡稱:slf4j)
它們本質上是一組接口,定義了像 info()、debug()、error() 等方法。 這些接口并不關心日志具體如何輸出、存在哪里,而是提供給各類日志實現(xiàn)框架一個統(tǒng)一的規(guī)范。
2. 日志實現(xiàn)框架
一些典型的日志實現(xiàn)框架:
- Log4j
- Logback
- Log4j2 等
這些框架才是真正干活的,負責把日志按要求寫到控制臺、文件、網絡等地方。
因為對 Commons Logging 的接口不滿意,有人搞了 SLF4J;
因為對 Log4j 的性能不滿意,有人搞了 Logback。
Java 日志體系就是這樣一步步演進出來的。
在現(xiàn)代項目中,常見組合是:
- 代碼依賴 SLF4J 接口
- 底層使用 Logback 作為實現(xiàn)
這樣你寫的代碼只依賴接口,以后如果要更換日志實現(xiàn)(從 Logback 換成 Log4j2 等),只要改依賴和配置,而不用改業(yè)務代碼。
三、Logback 概述
1. 什么是 Logback?
Logback是一個高性能的日志框架:
- 由 Log4j 作者開發(fā),是 Log4j 的“進化版”
- 基于 SLF4J 日志規(guī)范實現(xiàn)
- 性能和功能上普遍優(yōu)于傳統(tǒng)的 Log4j
很多現(xiàn)代框架(例如 Spring Boot)默認都使用 Logback 作為日志實現(xiàn)。
2. Logback
Logback 主要分為三個模塊:
logback-core- 核心模塊
- 為其他模塊提供基礎功能
- 使用 Logback 必須有它
logback-classic- 完整實現(xiàn)了 SLF4J API 的模塊
- 一般我們日常使用的就是這個模塊配合
logback-core
logback-access- 與 Tomcat、Jetty 等 Servlet 容器集成
- 用于記錄 HTTP 訪問日志
一般 Java 應用最常用的是:logback-core + logback-classic。
四、Logback 快速入門
1. 引入依賴
以 Maven 項目為例,只要引入 SLF4J 接口和 Logback 實現(xiàn)(很多場景 Spring Boot 已經幫你引好了):
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>最新穩(wěn)定版</version>
</dependency>logback-classic 會自動依賴 logback-core 和 slf4j-api,通常不用你再額外引。
2. 基本使用方式
在代碼中使用時,永遠面向 SLF4J 接口編程:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
// 獲取日志對象
private static final Logger log = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
log.trace("這是 trace 級別日志");
log.debug("這是 debug 級別日志");
log.info("這是 info 級別日志");
log.warn("這是 warn 級別日志");
log.error("這是 error 級別日志");
}
}看起來和 System.out.println() 很像,但本質完全不同:
- 輸出位置可以是:控制臺 / 文件 / 甚至遠程日志收集系統(tǒng)
- 輸出格式、是否輸出、輸出多少,全由配置文件控制
- 不需要改業(yè)務代碼就可以調整日志策略
五、Logback 配置:輸出位置與格式
Logback 的配置通常通過一個 XML 文件完成,默認文件名為:
logback.xml(最常見)- 或
logback-spring.xml
1. 配置大體結構
典型結構包含:
<appender>:定義“輸出到哪里、以什么格式輸出”<logger>:定義某個包/類的日志級別與使用哪些 appender<root>:根日志器,所有日志最終都會歸到這里
2. 輸出位置(Appender)
常見的輸出目的地:
- 控制臺:
ConsoleAppender - 文件:
FileAppender - 滾動文件(按大小/日期拆分日志文件):
RollingFileAppender
舉個簡單示例:
<configuration>
<!-- 控制臺輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件輸出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<!-- 這里可以配置按日期/大小滾動等 -->
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志器,設置級別和使用的 appender -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>你在筆記中提到:
“logback可以存在文件中,具體文件可以存在哪里,xml文件里面可以設置。”
就是通過 <file>、滾動策略等配置來確定日志保存路徑和拆分策略。
六、日志級別詳解
項目上線后,常見的兩種需求:
- 線上環(huán)境只記錄重要的錯誤信息,不要太多無用日志
- 某個問題需要排查時,暫時想多打一點日志看看細節(jié)
這就要靠日志級別來精細控制輸出。
1. 常見日志級別(從低到高)
一般從低到高是:
TRACE:最詳細的日志,一般只在調試極其復雜問題時使用DEBUG:調試信息,開發(fā)環(huán)境常用INFO:常規(guī)業(yè)務運行信息,如重要步驟、關鍵結果WARN:警告信息,可能有問題但不影響系統(tǒng)繼續(xù)跑ERROR:錯誤信息,功能失敗或系統(tǒng)異常
在配置中給某個 logger 設定了某個級別之后,只會輸出該級別及以上的日志。
例如:
<root level="INFO">
...
</root>表示:
TRACE、DEBUG級別日志不會輸出INFO、、 會輸出WARNERROR
2. 通過級別控制日志開關
“可以通過設置日志的輸出級別來控制哪些日志信息輸出或者不輸出。”
好處是顯而易見的:
- 開發(fā)環(huán)境:可以把級別設為
DEBUG或TRACE,看到更多細節(jié) - 測試環(huán)境:設為
INFO,既能看業(yè)務流程又不會太吵 - 生產環(huán)境:通常設為
WARN或ERROR,只關注潛在問題和錯誤
最重要的是,這一切都是通過配置文件修改完成,無需改任何業(yè)務代碼。
總結
到此這篇關于Java日志與Logback的文章就介紹到這了,更多相關Java日志與Logback內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Apache Commons fileUpload實現(xiàn)文件上傳之一
這篇文章主要介紹了Apache Commons fileUpload實現(xiàn)文件上傳之一的相關資料,需要的朋友可以參考下2016-03-03
Springboot之如何統(tǒng)計代碼執(zhí)行耗時時間
這篇文章主要介紹了Springboot之如何統(tǒng)計代碼執(zhí)行耗時時間問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

