1. 程式人生 > >spring boot日誌管理配置

spring boot日誌管理配置

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>

          </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,就可以使用日誌了。