spring boot日誌管理配置
阿新 • • 發佈:2019-01-08
spring Boot在所有內部日誌中使用Commons Logging,但是預設配置也提供了對常用日誌的支援,如:Java Util Logging,Log4J,Log4J2和Logback。每種Logger都可以通過配置使用控制檯或者檔案輸出日誌內容。
控制檯輸出
在Spring Boot中預設配置了ERROR、WARN和INFO級別的日誌輸出到控制檯。
我們可以通過兩種方式切換至DEBUG級別:
a.在執行命令後加入--debug標誌,如:$ Java -jar myapp.jar --debug
b.在application.properties中配置debug=true,該屬性置為true的時候,核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,但是你自己應用的日誌並不會輸出為DEBUG級別。
多彩輸出
如果你的終端支援ANSI,設定彩色輸出會讓日誌更具可讀性。通過在application.properties中設定spring.output.ansi.enabled引數來支援。
a.NEVER:禁用ANSI-colored輸出(預設項)
b.DETECT:會檢查終端是否支援ANSI,是的話就採用彩色輸出(推薦項)
c.ALWAYS:總是使用ANSI-colored格式輸出,若終端不支援的時候,會有很多幹擾資訊,不推薦使用
檔案輸出
Spring Boot預設配置只會輸出到控制檯,並不會記錄到檔案中,但是我們通常生產環境使用時都需要以檔案方式記錄。
若要增加檔案輸出,需要在application.properties中配置logging.file或logging.path屬性。
logging.file,設定檔案,可以是絕對路徑,也可以是相對路徑。如:logging.file=my.log
logging.path,設定目錄,會在該目錄下建立spring.log檔案,並寫入日誌內容,如:logging.path=/var/log
日誌檔案會在10Mb大小的時候被截斷,產生新的日誌檔案,預設級別為:ERROR、WARN、INFO
級別控制
在Spring Boot中只需要在application.properties中進行配置完成日誌記錄的級別控制。
配置格式:logging.level.*=LEVEL
logging.level:日誌級別控制字首,*為包名或Logger名
LEVEL:選項TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
舉例:
logging.level.com.didispace=DEBUG:com.didispace包下所有class以DEBUG級別輸出
logging.level.root=WARN:root日誌以WARN級別輸出
自定義日誌配置
由於日誌服務一般都在ApplicationContext建立前就初始化了,它並不是必須通過Spring的配置檔案控制。因此通過系統屬性和傳統的Spring Boot外部配置檔案依然可以很好的支援日誌控制和管理。
根據不同的日誌系統,你可以按如下規則組織配置檔名,就能被正確載入:
1.Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
2.Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
3.Log4j2:log4j2-spring.xml, log4j2.xml
4.JDK (Java Util Logging):logging.properties
Spring Boot官方推薦優先使用帶有-spring的檔名作為你的日誌配置(如使用logback-spring.xml,而不是logback.xml)
自定義輸出格式
在Spring Boot中可以通過在application.properties配置如下引數控制輸出格式:
logging.pattern.console:定義輸出到控制檯的樣式(不支援JDK Logger)
logging.pattern.file:定義輸出到檔案的樣式(不支援JDK Logger)
使用log4j記錄日誌
引入log4j依賴
在建立Spring Boot工程時,我們引入了spring-boot-starter,其中包含了spring-boot-starter-logging,該依賴內容就是Spring Boot預設的日誌框架Logback,所以我們在引入log4j之前,需要先排除該包的依賴,再引入log4j的依賴,就像下面這樣:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
配置log4j.properties
在引入了log4j依賴之後,只需要在src/main/resources目錄下加入log4j.properties配置檔案,就可以開始對應用的日誌進行配置使用。
控制檯輸出
通過如下配置,設定root日誌的輸出級別為INFO,appender為控制檯輸出stdout:
# LOG4J配置
log4j.rootCategory=INFO, stdout
# 控制檯輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
輸出到檔案
在開發環境,我們只是輸出到控制檯沒有問題,但是到了生產或測試環境,或許持久化日誌內容,方便追溯問題原因。可以通過新增如下的appender內容,按天輸出到不同的檔案中去,同時還需要為log4j.rootCategory新增名為file的appender,這樣root日誌就可以輸出到logs/all.log檔案中了。
log4j.rootCategory=INFO, stdout, file
# root日誌輸出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=logs/all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
分類輸出
當我們日誌量較多的時候,查詢問題會非常困難,常用的手段就是對日誌進行分類,比如:
可以按不同package進行輸出。通過定義輸出到logs/my.log的appender,並對com.didispace包下的日誌級別設定為DEBUG級別、appender設定為輸出到logs/my.log的名為didifile的appender。
# com.didispace包下的日誌配置
log4j.category.com.didispace=DEBUG, didifile
# com.didispace下的日誌輸出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=logs/my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n
可以對不同級別進行分類,比如對ERROR級別輸出到特定的日誌檔案中,具體配置可以如下:
log4j.logger.error=errorfile
# error日誌輸出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=logs/error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
本文主要介紹如何在spring boot中引入log4j,以及一些基礎用法,對於更多log4j的用法,還請參考log4j官方網站
目前最新spring boot版本1.5.2支援log4j2記錄日誌
使用log4j2記錄日誌
首先自定義一個src/main/resources/log4j2.xml檔案,:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</Console>
<File name="File" fileName="/Users/zk_chs/logtest/zk_chs.log">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
<Logger name="org.apache.tomcat.util.NET.NioSelectorPool" level="warn" />
<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
<Logger name="org.springframework" level="warn" />
<Logger name="com.github" level="debug" />
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
在pom.xml按照spring boot的文件進行定義
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
最後在application.properties檔案中,指定載入的log檔案位置:
logging.config=classpath:log4j2.xml
目前我們的日誌是在控制檯進行輸出,如果需要輸出到檔案中的話,新增<AppenderRef ref="File" />即可
ps:根據spring boot官網的方式,
在java類中加入:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static Logger logger = LogManager.getLogger(IndexInterceptor2.class.getName());
報錯:
The import org.apache.logging.log4j.LogManager cannot be resolved
於是在pom.xml加入一下依賴就可以了:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
這樣是沒問題的,在src/main/resources下新增log4j.properties,就可以使用日誌了。
控制檯輸出
在Spring Boot中預設配置了ERROR、WARN和INFO級別的日誌輸出到控制檯。
我們可以通過兩種方式切換至DEBUG級別:
a.在執行命令後加入--debug標誌,如:$ Java -jar myapp.jar --debug
b.在application.properties中配置debug=true,該屬性置為true的時候,核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,但是你自己應用的日誌並不會輸出為DEBUG級別。
多彩輸出
如果你的終端支援ANSI,設定彩色輸出會讓日誌更具可讀性。通過在application.properties中設定spring.output.ansi.enabled引數來支援。
a.NEVER:禁用ANSI-colored輸出(預設項)
b.DETECT:會檢查終端是否支援ANSI,是的話就採用彩色輸出(推薦項)
c.ALWAYS:總是使用ANSI-colored格式輸出,若終端不支援的時候,會有很多幹擾資訊,不推薦使用
檔案輸出
Spring Boot預設配置只會輸出到控制檯,並不會記錄到檔案中,但是我們通常生產環境使用時都需要以檔案方式記錄。
若要增加檔案輸出,需要在application.properties中配置logging.file或logging.path屬性。
logging.file,設定檔案,可以是絕對路徑,也可以是相對路徑。如:logging.file=my.log
logging.path,設定目錄,會在該目錄下建立spring.log檔案,並寫入日誌內容,如:logging.path=/var/log
日誌檔案會在10Mb大小的時候被截斷,產生新的日誌檔案,預設級別為:ERROR、WARN、INFO
級別控制
在Spring Boot中只需要在application.properties中進行配置完成日誌記錄的級別控制。
配置格式:logging.level.*=LEVEL
logging.level:日誌級別控制字首,*為包名或Logger名
LEVEL:選項TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
舉例:
logging.level.com.didispace=DEBUG:com.didispace包下所有class以DEBUG級別輸出
logging.level.root=WARN:root日誌以WARN級別輸出
自定義日誌配置
由於日誌服務一般都在ApplicationContext建立前就初始化了,它並不是必須通過Spring的配置檔案控制。因此通過系統屬性和傳統的Spring Boot外部配置檔案依然可以很好的支援日誌控制和管理。
根據不同的日誌系統,你可以按如下規則組織配置檔名,就能被正確載入:
1.Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
2.Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
3.Log4j2:log4j2-spring.xml, log4j2.xml
4.JDK (Java Util Logging):logging.properties
Spring Boot官方推薦優先使用帶有-spring的檔名作為你的日誌配置(如使用logback-spring.xml,而不是logback.xml)
自定義輸出格式
在Spring Boot中可以通過在application.properties配置如下引數控制輸出格式:
logging.pattern.console:定義輸出到控制檯的樣式(不支援JDK Logger)
logging.pattern.file:定義輸出到檔案的樣式(不支援JDK Logger)
使用log4j記錄日誌
引入log4j依賴
在建立Spring Boot工程時,我們引入了spring-boot-starter,其中包含了spring-boot-starter-logging,該依賴內容就是Spring Boot預設的日誌框架Logback,所以我們在引入log4j之前,需要先排除該包的依賴,再引入log4j的依賴,就像下面這樣:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
配置log4j.properties
在引入了log4j依賴之後,只需要在src/main/resources目錄下加入log4j.properties配置檔案,就可以開始對應用的日誌進行配置使用。
控制檯輸出
通過如下配置,設定root日誌的輸出級別為INFO,appender為控制檯輸出stdout:
# LOG4J配置
log4j.rootCategory=INFO, stdout
# 控制檯輸出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
輸出到檔案
在開發環境,我們只是輸出到控制檯沒有問題,但是到了生產或測試環境,或許持久化日誌內容,方便追溯問題原因。可以通過新增如下的appender內容,按天輸出到不同的檔案中去,同時還需要為log4j.rootCategory新增名為file的appender,這樣root日誌就可以輸出到logs/all.log檔案中了。
log4j.rootCategory=INFO, stdout, file
# root日誌輸出
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=logs/all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
分類輸出
當我們日誌量較多的時候,查詢問題會非常困難,常用的手段就是對日誌進行分類,比如:
可以按不同package進行輸出。通過定義輸出到logs/my.log的appender,並對com.didispace包下的日誌級別設定為DEBUG級別、appender設定為輸出到logs/my.log的名為didifile的appender。
# com.didispace包下的日誌配置
log4j.category.com.didispace=DEBUG, didifile
# com.didispace下的日誌輸出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=logs/my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n
可以對不同級別進行分類,比如對ERROR級別輸出到特定的日誌檔案中,具體配置可以如下:
log4j.logger.error=errorfile
# error日誌輸出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=logs/error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
本文主要介紹如何在spring boot中引入log4j,以及一些基礎用法,對於更多log4j的用法,還請參考log4j官方網站
目前最新spring boot版本1.5.2支援log4j2記錄日誌
使用log4j2記錄日誌
首先自定義一個src/main/resources/log4j2.xml檔案,:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</Console>
<File name="File" fileName="/Users/zk_chs/logtest/zk_chs.log">
<PatternLayout>
<pattern>%d %p %C{1.} [%t] %m%n</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" />
<Logger name="org.apache.tomcat.util.NET.NioSelectorPool" level="warn" />
<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
<Logger name="org.springframework" level="warn" />
<Logger name="com.github" level="debug" />
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
在pom.xml按照spring boot的文件進行定義
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
最後在application.properties檔案中,指定載入的log檔案位置:
logging.config=classpath:log4j2.xml
目前我們的日誌是在控制檯進行輸出,如果需要輸出到檔案中的話,新增<AppenderRef ref="File" />即可
ps:根據spring boot官網的方式,
在java類中加入:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
private static Logger logger = LogManager.getLogger(IndexInterceptor2.class.getName());
報錯:
The import org.apache.logging.log4j.LogManager cannot be resolved
於是在pom.xml加入一下依賴就可以了:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
-----------------------------------------------------------------
按照上面新增log4j,可能pom.xml 無法下載spring-boot-starter-log4j.jar,因為使用的springboot版本,不存在這個jar,此時需要指定別的版本的jar
我的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>s.t.m</groupId>
<artifactId>stm-pro</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>stm-pro</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- springboot核心包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 1.4.3不存在,選擇了1.3.7 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
這樣是沒問題的,在src/main/resources下新增log4j.properties,就可以使用日誌了。