JUL、JCL、JBoss-logging、log4j、log4j二、slf4j等。html
日誌門面(抽象層) | 日誌實現 |
---|---|
JCL(Jakra Commons Logging) SLF4j(Simple Logging Facade for Java) Jboss-Logging | Log4j JUL(java.util.logging) Log4j2 Logback |
左邊選一個門面(抽象層),右邊選一個實現,但當前最合適的選擇仍是:java
SpringBoot的選擇:其底層因爲是Spring框架,Spring框架默認使用的是JCL,因此SB選用的是SLF4J和logback。web
之後開發的時候,日誌記錄方法的調用,不該該直接調用日誌的實現類,而是調用日誌抽象層裏面的方法。 參考slf4j官方網站spring
給系統裏面導入slf4j的jar和logback的實現jar設計模式
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
圖示:springboot
每個日誌的實現框架都有本身的配置文件。使用slf4j之後,配置文件仍是作成日誌實現框架的配置文件;也就是說,slf4j只是提供了一個抽象標準而已。app
項目A(slf4j+logback):Spring(commons-logging)+Hiberrate(jboss-logging)。 則咱們仍是得須要統一日誌記錄,即便是別的框架也統一使用slf4j進行輸出。 框架
如何讓系統中的日誌都統一到slf4j:ide
在idea中新建一個項目後,分析pom文件的依賴,得到依賴關係圖,留意其中幾個比較核心的依賴部分:spring-boot
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.1.1.RELEASE</version> <scope>compile</scope> </dependency>
spring boot中使用他來作日誌功能
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <version>2.1.1.RELEASE</version> <scope>compile</scope> </dependency>
該依賴咱們能夠看到又依賴了很多日誌框架,從依賴關係中咱們能夠總結:
注:此部分的內容在2.0.x以後其實已經不同了,目前還沒深刻研究,以後仔細查看。
@RunWith(SpringRunner.class) @SpringBootTest public class Hello3ApplicationTests { Logger logger = LoggerFactory.getLogger(getClass()); @Test public void contextLoads() { // 日誌的級別 // 由低到高:trace<debug<info<warn<error // 經過此級別關係,咱們能夠經過調整日誌的級別:日誌就只會在這個級別以及之後的更高級別才生效。 logger.trace("this is trace log..."); logger.debug("this is debug log..."); logger.info("this is info log..."); logger.warn("this is warn log..."); logger.error("this is error log..."); } }
輸出結果以下:
8-12-11 15:22:49.507 INFO 10116 --- [ main] c.z.s.hello3.Hello3ApplicationTests : this is info log... 2018-12-11 15:22:49.507 WARN 10116 --- [ main] c.z.s.hello3.Hello3ApplicationTests : this is warn log... 2018-12-11 15:22:49.507 ERROR 10116 --- [ main] c.z.s.hello3.Hello3ApplicationTests : this is error log...
從結果咱們不難看出,SB的默認日誌級別是info,即只輸出info及其之後更高級別的日誌信息。
找到配置文件,新增以下配置:
logging.level.com.zhaoyi = trace
該配置用於將com.zhaoyi包下面的全部日誌記錄級別爲trace,這樣就能夠保證測試輸出的結果包含trace及其之後級別的輸出了,而其餘包則繼續沿用logging.level.root的配置了(info)。
若是咱們不指定日誌輸出文件的話,日誌的全部信息都只會在控制檯輸出,那麼,若是咱們想要將日誌內容輸出到具體的日誌文件該怎麼作呢? 很簡單,使用以下配置:
logging.file=my_log.log
使用該配置以後,spring boot就會將當前生成的配置信息輸出到當前項目的根路徑下的日誌文件下,即my_log.log,固然若是您添加了具體的路徑信息,則就會在指定的路徑下生成日誌文件,這裏是默認路徑,即當前項目的根目錄下。
固然咱們也能夠配置默認的日誌路徑(注意是路徑,不是文件)
logging.path=/log_path/
該配置會在當前項目所在的磁盤根目錄生成一個log_path文件夾,並使用spring boot默認的日誌文件名spring.log生成一個日誌文件。
若是咱們同時配置了日誌文件(logging.file)和日誌路徑(logging.path)兩個選項,那麼生效的是logging.file配置。
該選項用於配置控制檯輸出的日誌格式。如:
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n
其中:
該配置用於配置日誌文件記錄的日誌格式,其配置方式同logging.pattern.console
。
若是咱們想要指定本身的相關日誌配置,則須要按以下官方文檔所示便可: |Logging System|Customization| |-|-| |Logback|logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy| |Log4j2|log4j2-spring.xml or log4j2.xml| |JDK (Java Util Logging)|logging.properties| 也就是說,咱們能夠直接在類路徑下放入包含以下配置信息的日誌配置文件logback-spring.xml,本身裁定日誌配置模式:
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true。 scanPeriod:設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。 debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。 --> <configuration scan="false" scanPeriod="60 seconds" debug="false"> <!-- 定義日誌的根目錄 --> <property name="LOG_HOME" value="/app/log" /> <!-- 定義日誌文件名稱 --> <property name="appName" value="atguigu-springboot"></property> <!-- ch.qos.logback.core.ConsoleAppender 表示控制檯輸出 --> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <!-- 日誌輸出格式: %d表示日期時間, %thread表示線程名, %-5level:級別從左顯示5個字符寬度 %logger{50} 表示logger名字最長50個字符,不然按照句點分割。 %msg:日誌消息, %n是換行符 --> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </layout> </appender> <!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其餘文件 --> <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 指定日誌文件的名稱 --> <file>${LOG_HOME}/${appName}.log</file> <!-- 當發生滾動時,決定 RollingFileAppender 的行爲,涉及文件移動和重命名 TimeBasedRollingPolicy: 最經常使用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 滾動時產生的文件的存放位置及文件名稱 %d{yyyy-MM-dd}:按天進行日誌滾動 %i:當文件大小超過maxFileSize時,按照i進行文件滾動 --> <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern> <!-- 可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置天天滾動, 且maxHistory是365,則只保存最近365天的文件,刪除以前的舊文件。注意,刪除舊文件是, 那些爲了歸檔而建立的目錄也會被刪除。 --> <MaxHistory>365</MaxHistory> <!-- 當日志文件超過maxFileSize指定的大小是,根據上面提到的%i進行日誌文件滾動 注意此處配置SizeBasedTriggeringPolicy是沒法實現按文件大小進行滾動的,必須配置timeBasedFileNamingAndTriggeringPolicy --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 日誌輸出格式: --> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern> </layout> </appender> <!-- logger主要用於存放日誌對象,也能夠定義日誌類型、級別 name:表示匹配的logger類型前綴,也就是包的前半部分 level:要記錄的日誌級別,包括 TRACE < DEBUG < INFO < WARN < ERROR additivity:做用在於children-logger是否使用 rootLogger配置的appender進行輸出, false:表示只用當前logger的appender-ref,true: 表示當前logger的appender-ref和rootLogger的appender-ref都有效 --> <!-- hibernate logger --> <logger name="com.atguigu" level="debug" /> <!-- Spring framework logger --> <logger name="org.springframework" level="debug" additivity="false"></logger> <!-- root與logger是父子關係,沒有特別定義則默認爲root,任何一個類只會和一個logger對應, 要麼是定義的logger,要麼是root,判斷的關鍵在於找到這個logger,而後判斷這個logger的appender和level。 --> <root level="info"> <appender-ref ref="stdout" /> <appender-ref ref="appLogAppender" /> </root> </configuration>
須要注意的是,在類路徑下放配置文件的時候,官方也推薦命名帶上spring擴展名,如Logback-spring.xml.其中:
springProfile
的話,logback是沒法識別該配置節的,會報錯;<springProfile name="dev"> <!-- configuration to be enabled when the "dev" profile is active --> </springProfile>
若此時咱們指定啓動參數--spring.profiles.active=dev
的話,該標籤所包含的配置纔會生效。
前面咱們已經知道,sb使用的默認日誌框架爲slf4j+logback,假若咱們須要使用其餘的日誌框架該如何作呢?(其實不推薦)。能夠按照slf4j的日誌是配圖進行相關的切換。例如用slf4j+log4j替換slf4j+logback。在pom文件中加入以下配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>logback-classic</artifactId> <groupId>ch.qos.logback</groupId> </exclusion> <exclusion> <artifactId>log4j-over-slf4j</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency>
又如:咱們想使用slf4j+log4j2,則須要加入以下配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
也就是說,在原先的默認pom配置上,排除掉spring-boot-starter-logging
,改用spring-boot-starter-log4j2
便可。而後咱們就在類路徑下寫log4j2的配置文件就能夠了。