SLF4J簡介與使用(整合log4j)

SLF4J簡介與使用(整合log4j)

一、概念

SLF4J的全稱是Simple Logging Facade for Java,即簡單日志門面。SLF4J并不是具體的日志框架,而是作為一個簡單門面服務于各類日志框架,如java.util.logging, logback和log4j。

SLF4J提供了統一的記錄日志的接口,對不同日志系統的具體實現進行了抽象化,只要按照其提供的方法記錄即可,最終日志的格式、記錄級別、輸出方式等通過綁定具體的日志系統來實現。

使用SLF4J的好處在于,你只需要按統一的方式寫記錄日志的代碼,如:

public class LoggerTest {private static final Logger logger = LoggerFactory.getLogger(Tester.class);public static void main(String[] args) {logger.info("Current Time: {}", System.currentTimeMillis());}
}

SLF4J支持{}作為占位符,等價于C語言中的%s,而不必再進行字符串的拼接,效率有顯著的提升(見后面運行結果)。

而無需關心日志是通過哪個日志系統,以什么風格輸出的。因為它們取決于部署項目時綁定的日志系統。
例如,在項目中使用了SLF4J記錄日志,并且綁定了log4j,則日志會以log4j的風格輸出;后期需要改為以logback的風格輸出日志,只需要將log4j替換成logback即可,不用修改項目中的代碼。

二、依賴

SLF4J綁定各類日志框架的原理圖:

SLF4J綁定各類日志框架的原理圖

由上圖可知,使用SLF4J依賴于slf4j-api-1.8.0-alpha2.jar,部署時還依賴于要綁定的日志系統的jar包和相應的適配器jar包。

以綁定log4j為例,需要導入以下包:

  • slf4j-api-1.8.0-alpha2.jar
  • log4j-1.2.17.jar
  • slf4j-log4j12-1.8.0-alpha2.jar

如果使用Maven,則只需添加適配器jar包依賴即可

三、使用示例

這里以SLF4J + log4j為例。

1.在pom.xml中添加依賴(或者手動導入上述3個jar包)

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.8.0-alpha2</version>
</dependency>

2.配置log4j

在類路徑下創建log4j.properties配置文件,這樣log4j會自動加載配置文件。

# rootLogger參數分別為:根Logger級別,輸出器stdout,輸出器log
log4j.rootLogger = info,stdout,log# 輸出信息到控制臺
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d [%-5p] %l %rms: %m%n# 輸出DEBUG級別以上的日志到D://logs/debug.log
log4j.appender.log = org.apache.log4j.DailyRollingFileAppender
log4j.appender.log.DatePattern = '.'yyyy-MM-dd
log4j.appender.log.File = D://debug.log
log4j.appender.log.Encoding = UTF-8
#log4j.appender.log.Threshold = INFO
log4j.appender.log.layout = org.apache.log4j.PatternLayout
log4j.appender.log.layout.ConversionPattern = %d [%-5p] (%c.%t): %m%n

將log4j.properties放在類路徑下是最簡單的做法,當然也可以通過PropertyConfigurator在代碼中加載或者通過web.xml加載。

3.測試代碼

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggerTest {private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);public static void main(String[] args) {logger.info("Current Time: {}", System.currentTimeMillis());logger.info("Current Time: " + System.currentTimeMillis());logger.info("Current Time: {}", System.currentTimeMillis());logger.trace("trace log");logger.warn("warn log");logger.debug("debug log");logger.info("info log");logger.error("error log");}
}

4.運行結果

2018-09-01 23:14:32,690 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:11) 2ms: Current Time: 1535814872683
2018-09-01 23:14:32,700 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:12) 12ms: Current Time: 1535814872700
2018-09-01 23:14:32,701 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:13) 13ms: Current Time: 1535814872701
2018-09-01 23:14:32,701 [WARN ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:15) 13ms: warn log
2018-09-01 23:14:32,701 [INFO ] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:17) 13ms: info log
2018-09-01 23:14:32,701 [ERROR] com.lun.helloslf4j.LoggerTest.main(LoggerTest.java:18) 13ms: error log

在這里插入圖片描述

通常輸出日志開銷非常大,從上述結果可見,SLF4J通過{}作為占位符的方式輸出字符串,相比字符串拼接的方式,效率有顯著的提升。

5.更換日志系統

看到這里,你可能會有疑問:既然都用了log4j,為什么還要用SLF4J來寫記錄日志的代碼呢,不是多此一舉嗎?

答案是否定的。假設我們不再需要log4j,而是希望改為使用java自帶logging記錄日志,我們需要做的僅僅是將pom.xml的依賴項slf4j-log4j12改為slf4j-jdk14即可,無需對上述測試代碼做任何修改。

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId><version>1.8.0-alpha2</version>
</dependency>

是的,就是這么簡單。再次運行測試代碼:

九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535309
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535475
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: Current Time: 1535815535477
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
警告: warn log
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
信息: info log
九月 01, 2018 11:25:35 下午 com.lun.helloslf4j.LoggerTest main
嚴重: error log

我們發現,此時日志已經變為以logging的方式輸出。

四、總結

SLF4J的使用非常簡單,甚至連官網上都說鑒于它太輕量,文檔篇幅不長。

Given the small size of SLF4J, its documentation is not very lengthy.

在《阿里巴巴Java開發手冊(正式版)》中,日志規約一項第一條就強制要求使用SLF4J:

【強制】應用中不可直接使用日志系統(Log4j、Logback)中的API,而應依賴使用日志框架SLF4J中的API,使用門面模式的日志框架,有利于維護和各個類的日志處理方式統一。

所以從現在開始使用SLF4J吧!

引用

來源處

官方文檔

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

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

相關文章

multism中ui和uo應該怎么表示_王者榮耀:夢淚直播時談到體驗服大改動,表示裝備的改動很關鍵...

王者榮耀的主播夢淚&#xff0c;大家都很熟了&#xff0c;也是一個很強的主播&#xff0c;他對于王者榮耀的理解&#xff0c;還是非常深刻的&#xff0c;而最近王者榮耀的體驗服&#xff0c;進行了大改動&#xff0c;也是改變了很多的東西。對此&#xff0c;網友們也是非常的在…

FFmpeg源代碼簡單分析-通用-結構體分析-AVStream

參考鏈接 FFMPEG結構體分析&#xff1a;AVStream_雷霄驊的博客-CSDN博客_avstream AVStream AVStream是是存儲每一個視頻/音頻流信息的結構體結構體的定義位于avformat.h重要參數介紹 int index&#xff1a;標識該視頻/音頻流AVCodecContext *codec&#xff1a;指向該視頻/音…

在Windows下安裝JDK的通常步驟

獲取安裝包 從官網或其他途徑下載JDK的Windows版本的安裝包&#xff0c;并點擊安裝。安裝向導中無需選擇配置項&#xff0c;默認操作即可&#xff0c;除了自定義的JDK安裝目錄。假設JDK的安裝目錄為C:\Program Files\Java。 設置環境變量 右擊桌面上的計算機&#xff0c;在菜單…

怎么關閉或者卸載ivanti_電腦軟件卸載不了怎么辦,教您解決電腦軟件無法卸載方法技巧...

我們在使用電腦的過程中&#xff0c;肯定會安裝各種軟件&#xff0c;但是一些軟件在使用完之后就不會再使用了&#xff0c;但又無法卸載。下面由小編分享一下電腦安裝的軟件無法卸載解決方法&#xff0c;如果你在某卸載軟件的時候出現無法卸載的情況&#xff0c;不妨通過以下方…

FFmpeg源代碼簡單分析-通用-結構體分析-AVPacket

參考鏈接 FFMPEG結構體分析&#xff1a;AVPacket_雷霄驊的博客-CSDN博客_avpacket AVPacket AVPacket是存儲壓縮編碼數據相關信息的結構體結構體的定義位于packet.h重要參數介紹 uint8_t *data&#xff1a;壓縮編碼的數據。例如對于H.264來說。1個AVPacket的data通常對應一個…

h5支付不能打開支付寶 ios_iOS WKWebview中無法調起支付寶/微信客戶端支付問題的解決方法...

這兩個的解決思路都是要在下面這個方法中先攔截相應的url&#xff0c;再單獨處理- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;支付寶…

解決Github圖片加載失敗

問題描述 瀏覽自己Github某倉庫的README.md內時&#xff0c;發現文檔的圖片始終加載不出&#xff0c;打開瀏覽器后臺&#xff0c;冒出一片紅&#xff0c;Failed to load resource: net::ERR_CONNECTION_RESET&#xff0c;如下圖所示&#xff1a; 問題分析 可能造成這問題的原…

FFmpeg源代碼簡單分析-通用-結構體分析-AVFrame

參考鏈接 FFMPEG結構體分析&#xff1a;AVFrame_雷霄驊的博客-CSDN博客 AVFrame AVFrame是包含碼流參數較多的結構體結構體的定義位于frame.hAVFrame結構體一般用于存儲原始數據&#xff08;即非壓縮數據&#xff0c;例如對視頻來說是YUV&#xff0c;RGB&#xff0c;對音頻來…

python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配

問題&#xff1a;已知字符串 B 是字符串 A 的一個子串,問字符串 B 在字符串 A 的第一次出現位置.暴力方法:從 A 字符串 的每個位置開始對字符串 B 進行匹配. 這種方法根據數據的不同 復雜度不同最高可以達到O( m*n ). (m,n分別為兩個字符串的長度)KMP算法&#xff1a;我們先來看…

用Python將多張圖片合并成一PDF文件

先前條件 需要安裝兩模塊&#xff1a;fpdf、PIL pip install fpdfpip install PIL 放碼過來 from fpdf import FPDF from PIL import Image import osdef makePdf(pdfFileName, listPages):cover Image.open(listPages[0])width, height cover.sizepdf FPDF(unit "…

FFmpeg源代碼簡單分析-通用-結構體分析-關鍵結構體之間的關系

參考鏈接 FFMPEG中最關鍵的結構體之間的關系_雷霄驊的博客-CSDN博客_ffmpeg 結構體關系 最關鍵的結構體可以分成以下幾類&#xff1a; 解協議&#xff08;http,rtsp,rtmp,mms&#xff09; AVIOContext&#xff0c;URLProtocol&#xff0c;URLContext主要存儲視音頻使用的協…

用Python下載文件

前提條件 需要事先安裝requests模塊&#xff1a; pip install requests 放碼過來 import requestsurl XXX #文件下載來源URL filename #下載到本地后新文件名 r requests.get(url) with open(filename, "wb") as code:code.write(r.content)實戰演習 從目標…

distenct oracle_Oracle的distinct關鍵字

distinct關鍵字用于從查詢的結果集中篩選出唯一值的記錄。我們通過示例來介紹distinct關鍵字的用法。一、生成測試數據用以下SQL創建超女基本信息表(T_GIRL)&#xff0c;插入一些測試數據。create table T_GIRL(id char(4) not null, -- 編號name varchar2(30) not null, -- 姓…

FFmpeg源代碼簡單分析-通用-常見結構體的初始化和銷毀(AVFormatContext,AVFrame等)

參考鏈接 FFmpeg源代碼簡單分析&#xff1a;常見結構體的初始化和銷毀&#xff08;AVFormatContext&#xff0c;AVFrame等&#xff09;_雷霄驊的博客-CSDN博客 結構體 AVFormatContext&#xff1a;統領全局的基本結構體。主要用于處理封裝格式&#xff08;FLV/MKV/RMVB等&…

python中object轉為float_object格式怎樣無損轉換成float64格式

這次給大家帶來object格式怎樣無損轉換成float64格式&#xff0c;object格式無損轉換成float64格式的注意事項有哪些&#xff0c;下面就是實戰案例&#xff0c;一起來看一下。在數據處理過程中比如從CSV文件中導入數據data_df pd.read_csv("names.csv")在處理之前一…

FFmpeg源代碼簡單分析-通用-avio_open2()

參考鏈接 FFmpeg源代碼簡單分析&#xff1a;avio_open2()_雷霄驊的博客-CSDN博客_avio_open avio_open2() 該函數用于打開FFmpeg的輸入輸出文件avio_open2()的聲明位于libavformat\avio.h文件中&#xff0c;如下所示。 /*** Create and initialize a AVIOContext for accessi…

用Tomcat構建一個簡單圖片服務器

前提條件 Tomcat 7.0.90 方法一&#xff1a;修改配置文件 在TOMCAT_HOME/conf/server.xml配置文件內的<Host>內添加一子標簽&#xff1a; <Context docBase"C:\exambase\" path"/img"/>方法二&#xff1a;添加Servlet 新建一應用&#xf…

flash靜態的農夫走路_健身神動作——你不知道的“農夫行走”

原標題&#xff1a;健身神動作——你不知道的“農夫行走”本期導讀握力是訓練中及其重要的一環&#xff0c;強大的握力會使你的訓練效果MAX&#xff0c;就像開了加速器一樣&#xff01;很多人把握力和前臂力量混為一談&#xff0c;主要使用腕彎舉提高握力。實際上&#xff0c;握…

FFmpeg源代碼簡單分析-通用-av_find_decoder()和av_find_encoder()

參考鏈接 FFmpeg源代碼簡單分析&#xff1a;av_find_decoder()和av_find_encoder()_雷霄驊的博客-CSDN博客_avcodec_find_encoder avcodec_find_encoder avcodec_find_encoder()用于查找FFmpeg的編碼器avcodec_find_encoder()的聲明位于libavcodec\codec.h 版本差異avcode…

用Java的Set實現交并差等集合運算

放碼過來 package com.lun.util;import java.util.HashSet; import java.util.Set;public class SetUtils {public static <T> Set<T> union(Set<T> setA, Set<T> setB) {Set<T> tmp new HashSet<T>(setA);tmp.addAll(setB);return tmp;…