簡單日記門面(simple logging Facade for java)SLF4J是爲各類loging APIs提供一個簡單統一的接口,從而使得最終用戶可以在部署的時候配置本身但願的loging APIs實現。java
百度百科:apache
SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各類各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade,容許最終用戶在部署其應用時使用其所但願的日誌Systemapp
爲何使用slf4j:ide
咱們在開發過程當中可能使用各類log,每一個Log有不一樣的風格、佈局,若是想靈活的切換那麼slf4j是比較好的選擇。佈局
引入依賴: 性能
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency>
這樣咱們的依賴中就會多出3個jar,分別是:測試
引入配置文件:編碼
這裏咱們結合的是log4j,因此引入Log4j的的配置文件在當前classpath下:log4j.propertiesspa
# 可設置級別:TRACE→DEBUG→INFO→WARNING→ERROR→FATAL→OFF
# 高級別level會屏蔽低級別level。
# debug:顯示debug、info、error
# info:顯示info、error
#log4j.rootLogger=DEBUG,console,file
log4j.rootLogger=INFO,console
#輸出到控制檯
log4j.appender.console=org.apache.log4j.ConsoleAppender
#設置輸出樣式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#日誌輸出信息格式爲
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
#輸出到文件(這裏默認爲追加方式)
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=F:/LinkinPark/logs/Log4J.log
#樣式爲TTCCLayout
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
#自定義樣式
#%c 輸出所屬的類目,一般就是所在類的全名
#%C 輸出Logger所在類的名稱,一般就是所在類的全名
#%d 輸出日誌時間點的日期或時間,默認格式爲ISO8601,也能夠在其後指定格式,好比:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
#%F 輸出所在類的類名稱,只有類名。
#%l 輸出語句所在的行數,包括類名+方法名+文件名+行數
#%L 輸出語句所在的行數,只輸出數字
#%m 輸出代碼中指定的訊息,如log(message)中的message
#%M 輸出方法名
#%p 輸出日誌級別,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 輸出自應用啓動到輸出該log信息耗費的毫秒數
#%t 輸出產生該日誌事件的線程名
#%n 輸出一個回車換行符,Windows平臺爲「/r/n」,Unix平臺爲「/n」
#%% 用來輸出百分號「%」
#log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m
#log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n
#log4j.appender.Linkin.layout.ConversionPattern = %d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
編碼測試代碼:.net
初始化logger的方式不同了:
private static final Logger log = LoggerFactory.getLogger(LogTest.class);
//以前的方式:public static Logger log = Logger.getLogger(LogTest.class);
log的輸出日誌的寫法也稍有不一樣(下節講解):
log.info("info...{}", "info..."); log.warn("warn...{}", age);
完整測試代碼以下:
package com.log; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 日誌測試類 * 做者: Administrator * 日期: 2017/9/20 **/
public class LogTest { // 獲取日誌對象
private static final Logger log = LoggerFactory.getLogger(LogTest.class); private static Integer age = 18; private static String name = "Alice"; public static void log() { log.debug("debug....{}", "debug..."); log.info("info...{}", "info..."); log.warn("warn...{}", age); log.error("error...{}", name); try { int i = 10 / 0; } catch (Exception e) { log.error(e.getMessage()); } } public static void main(String[] args) { log(); } }
結果:
入門程序參考自:http://blog.csdn.net/anialy/article/details/8529188
因爲log4j的拼接字符串的形式,不管從性能上或者從優雅性上,都難以知足,因此,咱們強烈推薦使用slf4j來進行日誌記錄!
使用log4j輸出程序中參數變量的日誌寫法大概是這樣的:
if (logger.isDebugEnabled()) { logger.debug("Processing trade with id: " + id + " symbol: " + symbol); }
切換爲slf4j後:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
能夠看到,經過使用大括號 {} 來佔位,再經過參數的傳入來避免了拼接字符串的性能與代碼優雅性問題,同時省去了麻煩的isInfoEnabled()的判斷
固然,slf4j日誌還有一些重載方法,可參見API!
大括號 {} 對應如果POJO類等應當重寫toString()方法