做者:追夢1819
原文:https://www.cnblogs.com/yanfei1819/p/10973583.html
版權聲明:本文爲博主原創文章,轉載請附上博文連接!html
日誌是軟件系統的「基礎設施」,它能夠幫助咱們瞭解系統的運行軌跡,查找系統的運行異常等。不少人都沒有引發對日誌的重視。java
下面咱們先來設定幾個實際項目項目的場景:git
一、xxx物流雲系統,公司在給貨車司機打款的時候,司機沒收到帳款。司機在線等,沒收到帳款,就不繼續跑了;github
二、xxx商城小程序,給用戶進行退款的時候,用戶沒有收到錢,而後要舉報公司。。。;算法
三、線上系統掛了,待找緣由,待上線等。spring
這些都屬於很嚴重的生產事故了,直接影響公司的運營。然而,這些問題的解決,一般在要日誌中查找緣由(固然,日誌的做用不限於此),而後解決。數據庫
咱們見過最多的日誌相關的代碼莫過於System.out.println("");
,log4j
這兩種了。下面咱們來講說 SpringBoot 中日誌框架的使用。json
目前市面上的日誌框架有:小程序
JUL、JCL、Jboss-logging、logback、log4j、log4j二、slf4j....springboot
log4j 是 Apache 的一個開放源代碼項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、數據庫等;咱們也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,咱們可以更加細緻地控制日誌的生成過程。
Log4j有7種不一樣的log級別,按照等級從低到高依次爲:TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF。若是配置爲OFF級別,表示關閉 log。
Log4j支持兩種格式的配置文件:properties和xml。
包含三個主要的組件:Logger、appender、Layout。
slf4j,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,而是經過Facade Pattern提供一些Java logging API,它只服務於各類各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade,容許最終用戶在部署其應用時使用其所但願的日誌系統。做者建立SLF4J的目的是爲了替代Jakarta Commons-Logging。
實際上,slf4j 所提供的核心API是一些接口以及一個 LoggerFactory 的工廠類。在使用 slf4j 的時候,不須要在代碼中或配置文件中指定你打算使用那個具體的日誌系統。slf4j 提供了統一的記錄日誌的接口,只要按照其提供的方法記錄便可,最終日誌的格式、記錄級別、輸出方式等經過具體日誌系統的配置來實現,所以能夠在應用中靈活切換日誌系統。
適用場景:
若是你開發的是類庫或者嵌入式組件,那麼就應該考慮採用 slf4j,由於不可能影響最終用戶選擇哪一種日誌系統。在另外一方面,若是是一個簡單或者獨立的應用,肯定只有一種日誌系統,那麼就沒有使用 slf4j 的必要。假設你打算將你使用 log4j 的產品賣給要求使用 JDK 1.4 Logging 的用戶時,面對成千上萬的 log4j 調用的修改,相信這絕對不是一件輕鬆的事情。可是若是開始便使用slf4j,那麼這種轉換將是很是輕鬆的事情。
Logback,一個「可靠、通用、快速而又靈活的Java日誌框架」。
logback當前分紅三個模塊:logback-core,logback- classic和logback-access。logback-core 是其它兩個模塊的基礎模塊。logback-classic 是 log4j 的一個改良版本。此外logback-classic 完整實現 SLF4J API 使你能夠很方便地更換成其它日誌系統如log4j或JDK14 Logging。logback-access 訪問模塊與 Servlet 容器集成提供經過Http來訪問日誌的功能。
Java提供了本身的日誌框架,相似於 slf4j,可是API並不完善,對開發者不是很友好,並且對於日誌的級別分類也不是很清晰,好比:SEVERE, WARNING, INFO, CONFIG, FINE,FINER, FINEST。因此不推薦使用這種方式輸出日誌。
Jakarta Commons Logging 和 slf4j 很是相似,也是提供的一套API來掩蓋了真正的 logger 實現。便於不一樣的 logger 的實現的替換,而不須要從新編譯代碼。缺點在於它的查找 logger 的實現者的算法比較複雜,並且當出現了一些class loader之類的異常時,沒法去修復它。
已經有不少其餘的日誌框架對 slf4j 進行了改良,好比說 slf4j、logback 等。並且 log4j2 在各個方面都與 logback 很是類似,那麼爲何咱們還須要 log4j2 呢?
SpringBoot 默認使用的是 logback 日誌系統,須要引入 maven 依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
下面咱們看看底層的依賴關係:
由上圖能夠獲得幾個結論:
咱們在啓動類作一個簡單的測試,觀察效果:
@SpringBootApplication public class LogDemoApplication { private static final Logger logger = LoggerFactory.getLogger(LogDemoApplication.class); public static void main(String[] args) { logger.info("hello,logback!"); SpringApplication.run(LogDemoApplication.class, args); } }
以上代碼關於 LoggerFactory.getLogger()
方法中的參數 Clazz.class,主要是準確編寫class信息可以提供快速定位日誌的效率。便可以在日誌中款速定位到要查找的內容。
啓動程序,可以看到打印的日誌:
以上的示例中,都是用的 SpringBoot 默認的日誌屬性,固然,這些屬性可修改,下圖是屬性列表,能夠根據本身的需求進行自定義。
針對屬性中關於日誌格式的符號定義,此處也作一個簡單的說明:
%d{HH:mm:ss.SSS}——日誌輸出時間 %thread——輸出日誌的進程名字,這在Web應用以及異步任務處理中頗有用 %-5level——日誌級別,而且使用5個字符靠左對齊 %logger- ——日誌輸出者的名字 %msg——日誌消息 %n——平臺的換行符
以上示例是將日誌打印到控制檯。在實際項目中,日誌一般是進行持久化,存儲在文件中或者數據庫中。
1、存儲在文件中
只要在 application.properties 或者 application.yml 中配置如下屬性:
# 日誌路徑 logging.path= # 日誌名稱 logging.file=SpringBoot.log
2、存入數據庫
這種方式就是醒目中的添加業務了。一般用的很少。
SpringBoot 默認使用的日誌框架是 logback + slf4j ,若是想與其它的日誌框架整合,則必須將默認的日誌框架排除:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
與 log4j2 整合:
首先,引入 maven 依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
其次,log4j2.xml配置:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Properties> <property name="LOG_PATH">../logs/</property> <property name="LOG_FILE">testlog4j2</property> </Properties> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout> <pattern>%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n</pattern> </PatternLayout> </Console> <RollingFile name="errorlogfile" fileName="${LOG_PATH}/${LOG_FILE}.log" filePattern="${LOG_PATH}/$${date:yyyy-MM}/${LOG_FILE}-%d{yyyy-MM-dd HH-mm}-%i.log"> <PatternLayout> <pattern>%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] - %m%n</pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="50 MB" /> </Policies> <DefaultRolloverStrategy max="20" /> </RollingFile> </Appenders> <Loggers> <root level="info"> <AppenderRef ref="Console"/> <AppenderRef ref="errorlogfile" /> </root> </Loggers> </Configuration>
第三步,在 application.properties 中指定配置文件的位置:
logging.config= classpath:log4j2.xml
第四步,在啓動類中測試:
@SpringBootApplication public class LogOtherDemoApplication { private static Logger logger = LogManager.getLogger(LogOtherDemoApplication.class); public static void main(String[] args) { logger.info("這裏是整合其餘日誌框架"); SpringApplication.run(LogOtherDemoApplication.class, args); } }
最後,啓動項目,能夠看到對應的日誌和日誌文件。
日誌框架適用很普遍,並且涉及的內容內多,本章只作了日誌介紹和適用的闡述。後續還涉及不少的內容,好比如何進行日誌檢索、如何進行日誌清洗等。因爲篇幅所限,本章不作過多的介紹。
源碼:個人GitHub