Java常用日志框架介紹

Java提供了很多第三方的日志框架可供使用,按照現在的設計理念,一般把日志框架分成門面(Facade)部分和具體實現(Implementation)部分,門面(Facade)提供了抽象的api規范,實現(Implementation)負責實現api完成具體的日志記錄功能。開發者在使用日志框架時使用的是門面提供的api,可以根據實際情況靈活的選擇不同的api實現。

一、java.util.logging

1、概述

java.util.logging是Java標準庫自帶的日志框架,使用時無需引入第三方依賴,提供的功能相對簡單,一般不在實際項目中使用。

package com.demo;
import java.util.logging.Logger;class LoggingDemoApplicationTests {Logger logger = Logger.getLogger(LoggingDemoApplicationTests.class.getName());public static void main(String[] args) {logger.info("test logging.");}}
2、配置

java.util.logging的配置文件是.proerties文件,默認路徑是$JAVA_HOME/lib/logging.proerties,可以通過JVM參數或代碼指定自定義的配置文件。

使用JVM參數-Djava.util.logging.config.file指定:

java -Djava.util.logging.config.file=path/logging.properties mainApp.jar

使用代碼指定:

package org.example;
public class JavaLoggingTest {public static void main(String[] args) {try (InputStream inputStream = Main.class.getResourceAsStream("config/logging.properties")) {LogManager.getLogManager().readConfiguration(inputStream);} catch (Exception e) {e.printStackTrace();}// 日志記錄示例java.util.logging.Logger logger = java.util.logging.Logger.getLogger(Main.class.getName());logger.info("This is an info message.");}
}

配置文件內容:

# 全局日志級別
.level= INFO# 控制臺處理器的日志級別
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter# 文件處理器的日志級別
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter# 自定義日志記錄器的日志級別
com.example.JavaLoggingTest.level = FINE

二、commons-logging

1、概述

commons-logging(JCL)提供了一輕量和獨立于其他日志框架的個Log接口,它給開發者提供了簡單的日志抽象,允許開發者像使用插件一樣選擇具體的日志實現。

也就是說commons-logging是一個日志門面,其不提供具體的日志實現。commons-logging提供包裝了其他日志API和后端的Log接口的實現,包括Log4j2.xSlf4jjava.lang.logging,除此之外還有一些老的日志框架Log4j1.xAvalon LogKit等的實現,只不過默認是禁用的。

2、配置

commons-logging主要有兩個抽象類:org.apache.commons.logging.Logorg.apache.commons.logging.LogFactory,其中Log提供了統一的日志接口,而LogFactory作為一個工廠類提供了創建Log的方法。開發者在使用時可以手動指定一個Log的具體實現(例如前面提到的commons-logging提供的其他日志API的包裝實現或者自己實現一個Log),LogFactory作為創建Log的工廠接口,一般情況下我們不需要手動指定,除非需要使用其他高級功能。

JCL提供了三類LogFactory的實現,Log4jApiLogFactorySlf4jLogFactoryLogFactoryImpl。默認情況下JCL將按照下面的方式選擇一個LogFactory:

  • 如果Java類路徑里包含Log4j API,并且開發者沒有手動將Log4j API的實現重定向到SLF4j,則Log4jApiLogFactory將會被使用,JCL的日志調用將會交給Log4j API實現。
  • 如果類路徑里存在SLF4j,則Slf4jLogFactory將會被使用,JCL的日志調用將會交給SLF4j實現。
  • 如果都不存在,則JCL將會使用LogFactoryImpl

對于LogFactoryImpl來說,其通過下面的順序查找Log的實現,直到找到第一個可用的Log時,終止查找流程:

  • 查找配置屬性org.apache.commons.logging.Log是否設置了值,開發者可以通過在Java代碼里設置org.apache.commons.logging.Log的值,或者在Java類路徑下定義一個名字為commons-logging.properties的配置文件,在配置文件里設置commons-logging.properties的值,commons-logging.properties文件里的配置將作為LogFactory的屬性。如果類路徑下有多個配置文件的情況下,可以在配置文件里指定一個priority屬性指明優先級,優先級相同的兩個文件將會使用第一個找到那個。
  • 查找系統配置org.apache.commons.logging.Log的值,如果存在這個系統屬性將會使用這個屬性指定的值作為Log的實現。
  • 查找java.logging是否可用,如果可用將會使用Jdk14Logger類作為Log的實現。
  • 如果前面幾個步驟都沒有找到Log的具體實現,將會使用默認的實現類SimpleLog作為Log的實現。

三、Log4j 1.x

Log4j 1.x 是Apache軟件基金會開發的一個流行的Java日志框架,廣泛應用于早期的Java項目中。它提供了強大的日志記錄功能,支持靈活的配置和多種日志輸出方式。Log4j 1.x 已經停止維護,被Log4j2.x取代。我們不不需要對其詳細的做過多的了解。

Log4j 1.x使用類路徑下命名為log4j.properties的文件作為配置文件,開發者可以在該文件里配置相關屬性。

我們這里重點介紹對于一些依賴Log4j1.x的老舊項目和第三方庫,我們在依賴這些項目時應該怎么處理它們的日志輸出。如果我們有一個老項目project-log4j1使用了Log4j1.x作為其日志框架,現在我們有一個新項目需要依賴project-log4j1,但我們的新項目使用SLF4j作為日志框架,這時候我們應該怎么處理project-log4j的日志輸出呢?對此,SLF4j提供了適配器log4j-over-slf4j用來把調用Log4j1.x的日志操作重定向到SLF4j的日志輸出,我們只需要在項目里引入對應的依賴并提供SLF4j的實現和配置即可。

<dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><version>2.0.17</version>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.17</version>
</dependency>

當然SLF4j作為一個日志門面并不提供日志輸出的具體實現,至于使用什么框架作為SLF4j的具體實現對log4j-over-slf4j無影響。

除了SLF4j之外,apache也提供了相應的庫log4j-1.2-api用來將對Log4j1.x的調用重定向到Log4j2.x的實現,使用只需要引入依賴即可

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-1.2-api</artifactId><version>2.24.3</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.24.3</version>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.24.3</version>
</dependency>

如果使用Log4j2.x我們需要按照Log4j2.x的格式提供配置文件。

四、Log4j 2.x

1、概述

Log4j2.x是Apache Log4j1.x的升級版本,是一個支持異步日志記錄的高性能日志框架,它解決了 Log4j 1.x 的許多問題,并引入了許多新特性。Log4j2.x采用接口和實現分離的設計方式,從而提高了靈活性和可擴展性,其中log4j-api提供了抽象api,log4j-core提供了對應的實現,開發者在使用時可以只引入log4j-api,而使用其他例如SLF4j+Logback日志框架作為具體實現。

通過log4j-to-slf4j可以實現把對log4j-api的調用重定向到SLF4j,從而實現使用log4j-api作為門面,使用SLF4j+Logback作為日志具體實現的需求。

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-to-slf4j</artifactId><version>2.x.x</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.36</version>
</dependency>
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version>
</dependency>

此時,日志配置按照Logback的格式進行配置即可。

2、配置

Log4j2.x提供了多種格式的配置文件,默認情況下,Log4j2.x將會按照下面的名稱順序掃描類路徑找到配置文件:

  1. log4j2-test<contextName>.<extension>
  2. log4j2-test.<extension>
  3. log4j2<contextName>.<extension>
  4. log4j2.<extension>

其中contextName表示上下文信息,一般情況下我們使用log4j.<extension>命名的配置文件就能滿足需求,extension表示文件類型,例如log4j2.properties

Log4j2.x的配置文件支持xmljsonymalProperties格式,如果同時存在多個類型的配置文件,則將會按照下面的優先級查找:

  1. XML
  2. JSON
  3. YAML
  4. Properties

使用JSON格式的配置文件需要添加jackson-databind依賴,使用yaml格式的配置文件需要添加jackson-dataformat-yaml依賴

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.18.0</version><scope>runtime</scope>
</dependency><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId><version>2.18.0</version><scope>runtime</scope>
</dependency>

xml類型配置文件log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="https://logging.apache.org/xml/ns"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://logging.apache.org/xml/nshttps://logging.apache.org/xml/ns/log4j-config-2.xsd"><Appenders><Console name="CONSOLE"><PatternLayout pattern="%p - %m%n"/></Console><File name="MAIN" fileName="logs/main.log"><JsonTemplateLayout/></File><File name="DEBUG_LOG" fileName="logs/debug.log"><PatternLayout pattern="%d [%t] %p %c - %m%n"/></File></Appenders><Loggers><Root level="INFO"><AppenderRef ref="CONSOLE" level="WARN"/><AppenderRef ref="MAIN"/></Root><Logger name="org.example" level="DEBUG"><AppenderRef ref="DEBUG_LOG"/></Logger></Loggers>
</Configuration>

json格式配置文件log4j2.json

{"Configuration": {"Appenders": {"Console": {"name": "CONSOLE","PatternLayout": {"pattern": "%p - %m%n"}},"File": [{"name": "MAIN","fileName": "logs/main.log","JsonTemplateLayout": {}},{"name": "DEBUG_LOG","fileName": "logs/debug.log","PatternLayout": {"pattern": "%d [%t] %p %c - %m%n"}}]},"Loggers": {"Root": {"level": "INFO","AppenderRef": [{"ref": "CONSOLE","level": "WARN"},{"ref": "MAIN"}]},"Logger": {"name": "org.example","level": "DEBUG","AppenderRef": {"ref": "DEBUG_LOG"}}}}
}

ymal格式配置文件log4j2.yaml

Configuration:Appenders:Console:name: "CONSOLE"PatternLayout:pattern: "%p - %m%n"File:- name: "MAIN"fileName: "logs/main.log"JsonTemplateLayout: {}- name: "DEBUG_LOG"fileName: "logs/debug.log"PatternLayout:pattern: "%d [%t] %p %c - %m%n"Loggers:Root:level: "INFO"AppenderRef:- ref: "CONSOLE"level: "WARN"- ref: "MAIN"Logger:name: "org.example"level: "DEBUG"AppenderRef:ref: "DEBUG_LOG"

Properties格式配置文件log4j2.properties

appender.0.type = Console
appender.0.name = CONSOLE
appender.0.layout.type = PatternLayout
appender.0.layout.pattern = %p - %m%nappender.1.type = File
appender.1.name = MAIN
appender.1.fileName = logs/main.log
appender.1.layout.type = JsonTemplateLayoutappender.2.type = File
appender.2.name = DEBUG_LOG
appender.2.fileName = logs/debug.log
appender.2.layout.type = PatternLayout
appender.2.layout.pattern = %d [%t] %p %c - %m%nrootLogger.level = INFO
rootLogger.appenderRef.0.ref = CONSOLE
rootLogger.appenderRef.0.level = WARN
rootLogger.appenderRef.1.ref = MAINlogger.0.name = org.example
logger.0.level = DEBUG
logger.0.appenderRef.0.ref = DEBUG_LOG

五、Slf4j

1、概述

Slf4j是一個日志門面(Facade),只提供了日志接口抽象,使用Slf4j需要引入具體的日志實現,一般情況下使用Logback作為Slf4j的實現,因為Logback就是SLF4japi的標準實現。

使用SLF4j+Logback作為日志框架需要引入如下依賴:

<dependency> <groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.17</version>
</dependency><!-- JAVAX EE -->
<dependency> <groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.3.14</version>
</dependency><!-- Jakarta EE -->
<dependency> <groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.5.15</version>
</dependency>

Logback提供了logback-core模塊實現了基礎的日志功能,logback-classiclogback-core的基礎上實現了SLF4jAPI,在配合SLF4j使用時,一般情況下我們只需引入logback-classic即可。

除了Logback外,開發者也可以使用其他日志框架作為SLF4j的實現,例如Log4j2.x。apache提供了log4j-slf4j2-impl用來把SLF4j的API調用重定向到Log4j2.x。

<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.24.3</version><scope>test</scope>
</dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.x.x</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.x.x</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.36</version>
</dependency>

SLF4j橋接到Log4j2.x后,配置文件將使用相應的Log4j2.x配置文件。

也可以使用slf4j-log4j12SLF4j重定向到Log4j1.x,使用slf4j-jdk14SLF4j重定向到java.util.logging,不過正常情況下不這樣使用,現在項目中使用最多的就是SLF4j+Logback的搭配方式。

2、配置

LogBack使用XML作為配置文件的格式,默認情況下Logback將會在類路徑下按順序查找命名為logback-test.xmllogback.xml的配置文件

logback.xml

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><!-- encoders are assigned the typech.qos.logback.classic.encoder.PatternLayoutEncoder by default --><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="STDOUT" /></root>
</configuration>

六、其他框架

除了上面幾個常用的日志框架以外,Java還有很多其他的日志框架,這里只介紹在實際項目中比較常見的幾種。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91118.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

飛書 —— 多維表格 —— AI生成

1.添加關聯賬號&#xff1a; 2.獲取密鑰 ARK_API_KEY 進入火山引擎服務頁面&#xff1a;https://console.volcengine.com/ark/region:arkcn-beijing/model/detail?Iddeepseek-r1 先進入推理模型 > 快捷API接入 再去在線推理中創建推理接入點 點擊新創建好的接入點的API調…

我的世界模組開發教程——資源(1)

下面我們來研究一下ResourceLocation,每次開啟游戲時都會報這個錯誤:“ResourceLocation 中的 ResourceLocation(String) 已過時, 且標記為待刪除”,下面我們來詳細的研究一下這個類 ResourceLocation ResourceLocation 是 Minecraft 中用于唯一標識游戲資源的核心類(如方…

我從 Web2 轉型到 Web3 的 9 條經驗總結

作者&#xff1a;Forte Group 高級區塊鏈工程師 Yurii Kovalchuk原文&#xff1a;https://cryptoslate.com/why-i-left-web2-for-web3-and-why-you-might-too/三年前&#xff0c;我做出了一個徹底改變職業軌跡的決定&#xff1a;離開熟悉的 Web2&#xff0c;投身于深邃、混亂卻…

【MySQL 數據庫】MySQL索引特性(一)磁盤存儲定位扇區InnoDB頁

文章目錄沒有索引&#xff0c;可能會有什么問題二、認識磁盤2.1 MySQL與存儲2.2 磁盤&#xff1a;2.3 扇區2.4 定位扇區2.5 結論三、三者作用流程&#xff08;磁盤&#xff0c;塊&#xff0c;InnoDB頁&#xff09;四、MySQL與磁盤交互基本單位五、建立共識&#x1f6a9;總結沒有…

2419. 按位與最大的最長子數組

Problem: 2419. 按位與最大的最長子數組 文章目錄思路解題過程復雜度Code思路 按位異或只會讓數值越來越小&#xff0c;因此最長的連續按位與的最大值只存在于連續最大值中。 解題過程 遍歷數組取出最大值&#xff0c;再遍歷找到每一次連續最大值&#xff0c;從中取出最長的連續…

基于Java(SpringBoot)+Vue+MySQL 實現(Web)的網絡課程平臺

基于 SpringBoot 的網絡課程平臺1 緒論1.1 引言本科題研究并實現了一個面向網絡學習的平臺&#xff0c;為需要學習的人提供了一個學習的平臺。任何人都課在本平臺進行注冊登錄&#xff0c;學習觀看視頻。本平臺是一個關于網絡課程學習平臺&#xff0c;學員科自主選擇視頻學習&a…

Centos7 | 防火墻(firewalld)使用ipset管理ip地址的集合

文章目錄一、firewalld中ipset的用途1.1 用途1.2 注意與iptables所用的ipset命令的不同&#xff0c;1.3 配置詳解二、firewalld中ipset的操作例子2.1 新建一個set2.2 在set中添加ip2.3 從set中刪除ip2.4 刪除一個set2.5 打印一個set的文件路徑2.6 打印一個set的內容2.8 判斷一個…

Day06_C++編程

01.思維導圖02.將鳥籠放飛所有鳥類的題&#xff0c;改成觀察者模式#include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>//寫一個鳥類:有一個多…

【面試場景題】隨機立減金額計算

文章目錄背景設計思路方案結論高斯分布&#xff08;正態分布&#xff09;背景 某電商公司跟某銀行有合作&#xff0c;推進銀行信用卡辦卡&流水&#xff0c;使用此銀行信用卡用戶&#xff0c;支付可以隨機立減10&#xff5e;30元。其實公司每一筆都可獲得30元支付立減金&…

2025年湖北中級注冊安全工程師報考那些事

2025年湖北中級注冊安全工程師報考那些事各位從事建筑安全的人員看過來&#xff0c;注冊安全工程師是你們行業認可度較為高的證書。關于報考無論是安全相關專業跟不相關的專業都是可以報考的。只是年份要求不同。 本科&#xff1a;相關專業3年&#xff0c;不相關專業4年。 專科…

Prometheus + Grafana + Micrometer 監控方案詳解

這套組合是當前Java生態中最流行的監控解決方案之一&#xff0c;特別適合云原生環境下的微服務應用監控。下面我將從技術實現到最佳實踐進行全面解析。 一、技術棧組成與協作 1. 組件分工組件角色關鍵能力Micrometer應用指標門面(Facade)統一指標采集API&#xff0c;對接多種監…

實習小記(個人中心的編輯模塊)

實習小記&#xff08;個人中心的編輯模塊&#xff09; 項目需要加一個個人中心的編輯模塊&#xff0c;也是差不多搞了一天下來&#xff0c;其中遇到了很多問題&#xff0c;也是來記錄、分享一下。 技術棧&#xff1a;React、antd、TypeScript 需求 點擊編輯&#xff0c;彈出編…

【7】串口編程三種模式(查詢/中斷/DMA)韋東山老師學習筆記(課程聽不懂的話試著來看看我的學習筆記吧)

<1>前置概念補充在深入拆解三種模式前&#xff0c;先通過提供的 “函數對比表” 建立整體認知&#xff1a;這張表是串口收發的「武器庫索引」&#xff0c;清晰標注了查詢、中斷、DMA 三種模式下&#xff0c;收發 / 回調函數的對應關系。后續會結合實際代碼&#xff0c;講…

【Kubernetes 指南】基礎入門——Kubernetes 201(二)

二、滾動升級- 滾動升級&#xff08;Rolling Update&#xff09;通過逐個容器替代升級的方式來實現無中斷的服務升級&#xff1a;- 在滾動升級的過程中&#xff0c;如果發現了失敗或者配置錯誤&#xff0c;還可以隨時回滾&#xff1a;- 需要注意的是&#xff0c; kubectl rolli…

網絡資源模板--基于Android Studio 實現的圖書商城App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情&#xff08;部分) 登錄注冊頁 首頁 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載…

JavaWeb 進階:Vue.js 與 Spring Boot 全棧開發實戰(Java 開發者視角)

作為一名 Java 開發工程師&#xff0c;當你掌握了 HTML、CSS 和 JavaScript 的基礎后&#xff0c;是時候接觸現代前端框架了。Vue.js 以其簡潔的 API、漸進式的設計和優秀的中文文檔&#xff0c;成為眾多 Java 開發者入門前端框架的首選。Vue.js 讓你能快速構建響應式、組件化的…

智能體產品化的關鍵突破:企業智能化轉型的“最后一公里”如何邁過?

智能體產品化的關鍵突破&#xff1a;企業智能化轉型的“最后一公里”如何邁過&#xff1f; 在人工智能迅猛發展的當下&#xff0c;智能體&#xff08;Agent&#xff09;成為企業數字化轉型的新引擎。無論是市場分析、客戶服務&#xff0c;還是自動化辦公&#xff0c;智能體都被…

Rust × Elasticsearch官方 `elasticsearch` crate 上手指南

1 為什么選擇官方 Rust 客戶端&#xff1f; 語義化兼容&#xff1a;客戶端 主版本 與 ES 主版本 嚴格對應&#xff0c;8.x 客戶端可對接任何 8.x 服務器&#xff1b;不存在跨主版本兼容承諾 (docs.rs)100% API 覆蓋&#xff1a;穩定 API 全量映射&#xff0c;Beta/實驗特性可按…

怎樣畫流程圖?符號與流程解構教程

在數字化辦公和項目管理日益復雜的當下&#xff0c;流程圖早已不是工程師、項目經理的專屬工具&#xff0c;它正快速成為每一位職場人提升表達效率、理清工作邏輯的利器。無論是軟件開發中的流程規范、產品設計階段的用戶路徑&#xff0c;還是企業內部的審批流程、團隊協作機制…

vue3 + vite || Vue3 + Webpack創建項目

1.vue3 vite搭建項目方法 &#xff08;需要提前裝node,js&#xff09; 1. 使用官方 create-vite 工具&#xff08;推薦&#xff09; 1.使用npm----------------------------- npm create vuelatest2.使用pnpm----------------------------- pnpm create vuelatest3.使用yarn--…