SLF4J日誌的使用
需要的配置檔案和元件包,下面三個
jar 檔案和一個 properties 檔案都是要放在專案的 ClassPath 上。
1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties(也可以是 log4j.xml,本例中用 log4j.propertes)
log4j.properties
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target=System.out
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
- log4j.appender.db=org.apache.log4j.FileAppender
- log4j.appender.db.File=${s2sh.root}/WEB-INF/logs/ssh.log
- log4j.appender.db.Append=true
- log4j.appender.db.layout=org.apache.log4j.PatternLayout
- log4j.appender.db.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n
使用 SLF4J 的程式碼:
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class TestSlf4J {
- private static final Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
- public static void main(String[] args) {
- logger.info("Hello {}","SLF4J");
- }
- }
執行它,控制檯輸出:
- 2010-04-07 17:14:51,390 [com.unmi.TestSlf4j]-[INFO] Hello SLF4J
把這種 SLF4J+Log4J 的使用模式與曾為霸主地位的 JCL+Log4J 的用法進行一下對比(請忽略掉包檔案中的版本號):
把這種
SLF4J+Log4J 的使用模式與曾為霸主地位的 JCL+Log4J 的用法進行一下對比(請忽略掉包檔案中的版本號):
SLF4J+Log4j 組合 對比 JCL+Log4J 組合
slf4j-api-1.5.11.jar 相當,定義高層 API commons-logging-1.1.jar
slf4j-log4j12-1.5.11.jar 相當,左邊是用繫結包,右邊
是用配置檔案來指定日誌實現 commons-logging.properties,內容為:
org.apache.commons.logging.LogFactory=
org.apache.commons.logging.impl.LogFactoryImpl
或者
org.apache.commons.logging.Log=
org.apache.commons.logging.impl.Log4JLogger
log4j-1.2.15.jar 一樣 log4j-1.2.15.jar
log4j.properties 一樣,原來怎麼配置現在也是 log4j.properties
程式程式碼中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
logger.info("Hello {}","SLF4J"); 左邊侵入的是 SLF4J API,右邊是被 JCL 的 API 汙染了
SLF4J 支援引數化,而 JCL 不能 程式程式碼中:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Log log = LogFactory.getLog(TestJCL.class);
log.info("Hello JCL");
從上面的對比來看,SLF4j+Log4j 與 JCL+Log4J 的使用方式差不多,主要差異就在 SLF4J 用 jar 來告知用哪種日誌實現,而 JCL 是通過配置檔案來獲得該選擇哪個日誌實現。
為什麼會興起 SLF4J,看看我們原來哪一個框架中,大的如 SSH 三雄(Spring、Struts、Hibernate),還有 WAS 應用伺服器,小的就不計其數以前用的通用日誌框架都清一色的 Jakarta Commons Logging(JCL),日誌實現會選用 Log4j,為何現在 Hibernate、Tapesty、DbUnit、Jetty V6 等紛紛變節,都採用了 SLF4J 了呢?SLF4J 與 JCL 相比,定然是有其可表之處。而其中 SLF4J 受類載入器的影響較小,不易產生記憶體溢位的問題,效能得到了改善,更主要是順應了潮流的發展--可方便部署到 OSGI 環境中.
SLF4J+LogBack
前面講的 SLF4J 的用法之一是 SLF4J+Log4J,而這裡要推出的組合是 SLF4J+LogBack。不用 Log4J?難道還有比 Log4J 更好的日誌實現嗎?是的,答案就是 LogBack。假如你知道 LogBack 和 Log4J 是同出一位大師之手,你就不會覺得驚訝了。LogBack 對 Log4J 進行了增強,並投入了 SLF4J 的懷抱,它還被作者認定為 Log4J 的繼任者。
Logback
分為三個模組:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身實現了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日誌實現,如原始的 Log4J,java.util.logging 等;logback-access 讓你方便的訪問日誌資訊,如通過 http 的方式。
還得提一點,Logback 能更好的放到 OSGI 環境中。好了,簡單紹完了 Logback,就來看看具體怎麼用它。
需要的配置檔案和元件包,下面三個 jar 檔案和一個 xml檔案都是要放在專案的 ClassPath 上。
slf4j-api-1.5.11.jar
logback-core-0.9.20.jar
logback-classic-0.9.20.jar
logback.xml 或 logback-test.xml (類似於 log4j.properties/log4j.xml)
Logback 先找 logback-test.xml,沒有則找 logback.xml 檔案,都找不到就使用 BasicConfigurator 基本配置,BasicConfigurator 就是相當於等會貼出的 logback.xml 檔案內容的配置。這裡我們用 logback.xml 配置檔案,以前的 log4j.properties 檔案可以用 PropertiesTranslator 轉換成 logback.xml 檔案內容。
下面是一個最簡單的 logback.xml 檔案內容
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
- <encoder charset="GBK">
- <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
- </encoder>
- </appender>
- <root level="DEBUG">
- <appender-ref ref="stdout" />
- </root>
- </configuration>
在 log4j.xml 能做的配置,logback.xml 中也能做到,而且還增強了諸如 <if><then><else>、<filter>、<sift> 等更強的控制,請參考 logback 的手冊 http://logback.qos.ch/manual/index.html。
使用 Logback 的程式碼
- package com.unmi;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- public class TestLogback {
- private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);
- public static void main(String[] args) {
- logger.info("Hello {}","TestLogback");
- }
- }
可以看到與使用 SLF4J 的程式碼沒有任何區別,因為本來用的通用日誌框架就是 SLF4J,說到底,這裡的 Logback 就相當於 SLF4J+Log4J 使用方式中的 Log4J 繫結和 Log4J 的功能。
執行上面的程式碼,輸出:
21:38:43.031 [main] INFO com.unmi.TestLogback - Hello TestLogback
還是和上次一樣,這裡就拿 SLF4J+Logback 和 SLF4J+Log4J 兩種方式作下比較:
相關文章
- 簡單使用SLF4J日誌
- 日誌框架SLF4J框架
- 日誌SLF4J解惑
- SLF4J 日誌門面
- 基於slf4j的日誌工具類
- Java日誌框架:SLF4J詳解Java框架
- 日誌?聊一聊slf4j吧
- SLF4J記錄日誌&&日誌檔案的滾動策略__SpringBootSpring Boot
- Hibernate學習:slf4j日誌框架框架
- Java中的日誌管理:SLF4J與LogbackJava
- SLF4J日誌記錄常見寫法
- SpringBoot中的slf4j日誌依賴關係Spring Boot
- Java日誌框架:slf4j作用及其實現原理Java框架
- 用slf4j統一管理日誌總結
- 徹底解決SLF4J的日誌衝突的問題
- SpringBoot裡slf4j日誌功能的預設實現Spring Boot
- Log4j2 + SLF4j打造日誌系統
- 在雲環境上使用SLF4J對Java程式進行日誌記錄Java
- 基於SLF4J MDC機制實現日誌的鏈路追蹤
- 微服務架構Day02-SpringBoot日誌slf4j微服務架構Spring Boot
- slf4j 更新版本導致無日誌輸出
- Java日誌服務入門系列教程——(1)SLF4J入門Java
- 使用Slf4j整合Log4j2構建專案日誌系統的完美解決方案
- YARN的日誌聚集配置使用Yarn
- 日誌服務之使用Nginx模式採集日誌Nginx模式
- 使用 .NET Core 的日誌記錄
- ELK日誌系統之使用Rsyslog快速方便的收集Nginx日誌Nginx
- logstash的安裝使用、收集json日誌、csv日誌總結JSON
- Go中使用Zap日誌庫與Lumberjack日誌切割Go
- Spring Boot日誌使用Spring Boot
- 使用Kafka做日誌收集Kafka
- Android日誌Log使用Android
- 使用慢查詢日誌
- 使用sql查alert日誌SQL
- .NET 8使用日誌功能以及自定義日誌提供程式
- nodejs 日誌模組 winston 的使用NodeJS
- mysql之 日誌體系(錯誤日誌、查詢日誌、二進位制日誌、事務日誌、中繼日誌)MySql中繼
- 使用 shell 命令統計日誌