SpringBoot(八)----SpringBoot配置日志文件


今天介紹一下SpringBoot配置日志文件

SpringBoot在所有的內部日志中使用Commons Logging,但是默認配置也提供了對常用日志的支持,如Java Util Logging,Log4J,Log4J2和Logback。但是每種Logger都可以通過配置使用控制台或者文件輸出日志內容。

一.SpringBoot默認日志Logback

SLF4J,是一個針對各類Java日志框架的統一Façade抽象。Java有很多的日志框架,如java.util.logging,log4j,logback,commons-logging,Spring框架使用的是Jakarta Commons Logging API(JCL)。而SLF4J定義了統一的日志抽象接口,而真正的日志實現則是在運行決定的。

Logback是log4j框架的作者開發的新一代日志框架,它能夠適應諸多運行環境,支持SLF4J。

默認情況下,SpringBoot使用SLF4J+Logback記錄日志。

二.日志輸出的內容元素

日志輸出的內容元素具體如下:

時間日期:精確到毫秒

日志級別:ERROR,WARN,INFO,DEBUG,TRACE

進程ID

分隔符:---標識實際日志的開始

線程名:方括號括起來的內容

Logger名:通常為源代碼類名

日志內容

三.添加日志依賴

網上給出的日志依賴為:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

Spring boot應用將自動使用logback作為應用日志框架,Spring Boot啟動的時候,由org.springframework.boot.logging.Logging-Application-Listener根據情況初始化並使用。spring-boot-starter中包含spring-boot-starter-logging,該依賴內容就是Spring boot默認的日志框架logback。

我自己使用的依賴如下:

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.20</version> </dependency> <!-- 添加logback-classic依賴 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <!-- 添加logback-core依賴 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency>

四.控制台輸出

日志級別從低到高分別是TRACE<DEBUG<INFO<WARN<ERROR<FATAL,如果設置為WARN,則低於WARN的信息都不會被輸出。

SpringBoot中默認配置ERROR、WARN和INFO級別的日志輸出到控制台。

在application.properties中配置logging.level.包名=‘日志級別’,可以控制控制台輸出日志級別,舉個例子:

首先,建一個springboot項目,項目目錄如下:

第二步,配置pom.xml文件,加入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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>springboot_002</groupId>
	<artifactId>springboot_002</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_002 Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.20</version>
		</dependency>
		<!-- 添加logback-classic依賴 -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>
		<!-- 添加logback-core依賴 -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		<!-- 繼承父包 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.4.3.RELEASE</version>
	</parent>
	<build>
		<finalName>springboot_002</finalName>
	</build>
</project>

第三步,在src/main/java目錄下建包com.zk.myspringboot,並創建一個SpringBootApplicationFirst.java啟動類。

SpringBootApplicationFirst.java

package com.zk.myspringboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class SpringBootApplicationFirst extends SpringBootServletInitializer{
	public static void main(String[]args){
        SpringApplication.run(SpringBootApplicationFirst.class, args);
    }
}

第四步,在src/main/resources目錄下配置application.properties文件,在application.properties中配置日志等級,如下:

logging.level.com.zk=debug

這里的日志級別等級可以更改。

最后,我們在src/test/java下創建包com.zk.myspringboot(測試類包名需要與啟動類包名保持一致),並在包中創建一個測試類SpringBootApplicationTest.java。

SpringBootApplicationTest.java

package com.zk.myspringboot;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootApplicationTests {
	//日志的級別
	/*
	 * 日志的級別是由高到低的
	 * SpringBoot默認日志級別---info級別
	 * trace>debug>info>warn>error
	 */
	//記錄器
	Logger logger=LoggerFactory.getLogger(getClass());
	@Test
	public void contextLoads() {		
		logger.trace("這是trace日志...");
		logger.debug("這是debug日志...");
		logger.info("這是info日志...");
		logger.warn("這是warn日志...");
		logger.error("這是error日志...");
	} 
}

我們啟動測試類,執行結果如下: 

可以看到日志的輸出內容。

當然我們可以通過配置屬性文件中的logging.file或者logging.path將日志文件輸出到單獨的文件中,需要注意的的是,這兩個配置文件的屬性值不可同時使用,否則

只有logging.file生效。

一.如果我們配置

logging.file=SpringBoot.log

則在工程目錄下會生成一個SpringBoot.log文件。

日志文件內容如下:

2020-04-08 16:38:31.006  INFO 20008 --- [main] c.z.m.SpringBootApplicationTests         : Starting SpringBootApplicationTests on zhangkun0400 with PID 20008 (started by zhangkun04 in D:\eclipseworkspace\springboot_002)
2020-04-08 16:38:31.006 DEBUG 20008 --- [main] c.z.m.SpringBootApplicationTests         : Running with Spring Boot v1.4.3.RELEASE, Spring v4.3.5.RELEASE
2020-04-08 16:38:31.007  INFO 20008 --- [main] c.z.m.SpringBootApplicationTests         : No active profile set, falling back to default profiles: default
2020-04-08 16:38:31.036  INFO 20008 --- [main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:38:31 CST 2020]; root of context hierarchy
2020-04-08 16:38:32.802  INFO 20008 --- [main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:38:31 CST 2020]; root of context hierarchy
2020-04-08 16:38:32.842  INFO 20008 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2020-04-08 16:38:32.844  INFO 20008 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2020-04-08 16:38:32.870  INFO 20008 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:38:32.870  INFO 20008 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:38:32.901  INFO 20008 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:38:33.050  INFO 20008 --- [main] c.z.m.SpringBootApplicationTests         : Started SpringBootApplicationTests in 2.379 seconds (JVM running for 3.06)
2020-04-08 16:38:33.073 DEBUG 20008 --- [main] c.z.m.SpringBootApplicationTests         : 這是debug日志...
2020-04-08 16:38:33.073  INFO 20008 --- [main] c.z.m.SpringBootApplicationTests         : 這是info日志...
2020-04-08 16:38:33.074  WARN 20008 --- [main] c.z.m.SpringBootApplicationTests         : 這是warn日志...
2020-04-08 16:38:33.074 ERROR 20008 --- [main] c.z.m.SpringBootApplicationTests         : 這是error日志...
2020-04-08 16:38:33.080  INFO 20008 --- [Thread-1] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:38:31 CST 2020]; root of context hierarchy
2020-04-08 16:46:06.593  INFO 14984 --- [main] c.z.m.SpringBootApplicationTests         : Starting SpringBootApplicationTests on zhangkun0400 with PID 14984 (started by zhangkun04 in D:\eclipseworkspace\springboot_002)
2020-04-08 16:46:06.594 DEBUG 14984 --- [main] c.z.m.SpringBootApplicationTests         : Running with Spring Boot v1.4.3.RELEASE, Spring v4.3.5.RELEASE
2020-04-08 16:46:06.594  INFO 14984 --- [main] c.z.m.SpringBootApplicationTests         : No active profile set, falling back to default profiles: default
2020-04-08 16:46:06.623  INFO 14984 --- [main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:46:06 CST 2020]; root of context hierarchy
2020-04-08 16:46:07.968  INFO 14984 --- [main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:46:06 CST 2020]; root of context hierarchy
2020-04-08 16:46:08.052  INFO 14984 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2020-04-08 16:46:08.053  INFO 14984 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2020-04-08 16:46:08.101  INFO 14984 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:46:08.102  INFO 14984 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:46:08.157  INFO 14984 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:46:08.410  INFO 14984 --- [main] c.z.m.SpringBootApplicationTests         : Started SpringBootApplicationTests in 2.123 seconds (JVM running for 2.649)
2020-04-08 16:46:08.449 DEBUG 14984 --- [main] c.z.m.SpringBootApplicationTests         : 這是debug日志...
2020-04-08 16:46:08.450  INFO 14984 --- [main] c.z.m.SpringBootApplicationTests         : 這是info日志...
2020-04-08 16:46:08.450  WARN 14984 --- [main] c.z.m.SpringBootApplicationTests         : 這是warn日志...
2020-04-08 16:46:08.451 ERROR 14984 --- [main] c.z.m.SpringBootApplicationTests         : 這是error日志...
2020-04-08 16:46:08.460  INFO 14984 --- [Thread-1] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:46:06 CST 2020]; root of context hierarchy
2020-04-08 21:07:59.766  INFO 15932 --- [main] c.z.m.SpringBootApplicationTests         : Starting SpringBootApplicationTests on zhangkun0400 with PID 15932 (started by zhangkun04 in D:\eclipseworkspace\springboot_002)
2020-04-08 21:07:59.768 DEBUG 15932 --- [main] c.z.m.SpringBootApplicationTests         : Running with Spring Boot v1.4.3.RELEASE, Spring v4.3.5.RELEASE
2020-04-08 21:07:59.769  INFO 15932 --- [main] c.z.m.SpringBootApplicationTests         : No active profile set, falling back to default profiles: default
2020-04-08 21:07:59.814  INFO 15932 --- [main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 21:07:59 CST 2020]; root of context hierarchy
2020-04-08 21:08:01.360  INFO 15932 --- [main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 21:07:59 CST 2020]; root of context hierarchy
2020-04-08 21:08:01.418  INFO 15932 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2020-04-08 21:08:01.420  INFO 15932 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2020-04-08 21:08:01.447  INFO 15932 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 21:08:01.448  INFO 15932 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 21:08:01.487  INFO 15932 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 21:08:01.639  INFO 15932 --- [main] c.z.m.SpringBootApplicationTests         : Started SpringBootApplicationTests in 2.275 seconds (JVM running for 3.022)
2020-04-08 21:08:01.661 DEBUG 15932 --- [main] c.z.m.SpringBootApplicationTests         : 這是debug日志...
2020-04-08 21:08:01.661  INFO 15932 --- [main] c.z.m.SpringBootApplicationTests         : 這是info日志...
2020-04-08 21:08:01.661  WARN 15932 --- [main] c.z.m.SpringBootApplicationTests         : 這是warn日志...
2020-04-08 21:08:01.661 ERROR 15932 --- [main] c.z.m.SpringBootApplicationTests         : 這是error日志...
2020-04-08 21:08:01.665  INFO 15932 --- [Thread-1] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 21:07:59 CST 2020]; root of context hierarchy

二.如果我們配置的是loggin.path,如下:

logging.path=/spring/log

則會在我們項目的磁盤下創建一個log文件,

spring.log日志文件內容如下:

2020-04-08 16:51:48.278  INFO 16368 --- [main] c.z.m.SpringBootApplicationTests         : Starting SpringBootApplicationTests on zhangkun0400 with PID 16368 (started by zhangkun04 in D:\eclipseworkspace\springboot_002)
2020-04-08 16:51:48.279 DEBUG 16368 --- [main] c.z.m.SpringBootApplicationTests         : Running with Spring Boot v1.4.3.RELEASE, Spring v4.3.5.RELEASE
2020-04-08 16:51:48.280  INFO 16368 --- [main] c.z.m.SpringBootApplicationTests         : No active profile set, falling back to default profiles: default
2020-04-08 16:51:48.323  INFO 16368 --- [main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:51:48 CST 2020]; root of context hierarchy
2020-04-08 16:51:51.273  INFO 16368 --- [main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:51:48 CST 2020]; root of context hierarchy
2020-04-08 16:51:51.402  INFO 16368 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2020-04-08 16:51:51.404  INFO 16368 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2020-04-08 16:51:51.469  INFO 16368 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:51:51.470  INFO 16368 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:51:51.560  INFO 16368 --- [main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-04-08 16:51:51.936  INFO 16368 --- [main] c.z.m.SpringBootApplicationTests         : Started SpringBootApplicationTests in 4.249 seconds (JVM running for 5.196)
2020-04-08 16:51:51.996 DEBUG 16368 --- [main] c.z.m.SpringBootApplicationTests         : 這是debug日志...
2020-04-08 16:51:51.997  INFO 16368 --- [main] c.z.m.SpringBootApplicationTests         : 這是info日志...
2020-04-08 16:51:51.998  WARN 16368 --- [main] c.z.m.SpringBootApplicationTests         : 這是warn日志...
2020-04-08 16:51:51.999 ERROR 16368 --- [main] c.z.m.SpringBootApplicationTests         : 這是error日志...
2020-04-08 16:51:52.038  INFO 16368 --- [Thread-1] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@5d0a1059: startup date [Wed Apr 08 16:51:48 CST 2020]; root of context hierarchy

   我們可以通過logging.pattern.console屬性或者logging.pattern.file屬性來設置我們的日志文件輸出格式。

logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss:SSS}----> [%thread]----> %-5level----> %logger{50}----> -%msg%n

 

logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss:SSS}----> [%thread]----> %-5level----> %logger{50}----> -%msg%n

 輸出內容如下:

 

五.自定義配置文件

5.1配置單個logback.xml環境 

我們可以在項目中自定義單個logback.xml文件,配置對應的日志文件信息。

工程目錄如下:

 

添加logback.xml

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
    debug="false" scan="true" scanPeriod="30 second">

    <property name="PROJECT" value="iorder" /> 
    <property name="ROOT" value="logs/${PROJECT}/" />
    <property name="FILESIZE" value="50MB" />
    <property name="MAXHISTORY" value="100" />
    <timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss" />
    <!-- 控制台打印 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </encoder>
    </appender>
    <!-- ERROR 輸入到文件,按日期和文件大小 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/error.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    
    <!-- WARN 輸入到文件,按日期和文件大小 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    
    <!-- INFO 輸入到文件,按日期和文件大小 -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    <!-- DEBUG 輸入到文件,按日期和文件大小 -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    <!-- TRACE 輸入到文件,按日期和文件大小 -->
    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>TRACE</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    
    <!-- SQL相關日志輸出-->
    <logger name="org.apache.ibatis" level="INFO" additivity="false" />
    <logger name="org.mybatis.spring" level="INFO" additivity="false" />
    <logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false" />
    
    <!-- Logger 根目錄 -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="DEBUG" />  
        <appender-ref ref="ERROR" />
        <appender-ref ref="WARN" />
        <appender-ref ref="INFO" /> 
        <appender-ref ref="TRACE" />
    </root>
</configuration>

 可以在logback.xml中配置對應的日志信息。啟動程序輸出內容如下:

5.2配置多個logback環境

我們也可以在logback-spring.xml文件中配置多個logback環境,具體logback-spring.xml配置如下:

首先將logback.xml更改命名為logback-spring.xml,需要更改文件名,否則無法識別<spring-Profile>標簽。

 

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
    debug="false" scan="true" scanPeriod="30 second">

    <property name="PROJECT" value="iorder" /> 
    <property name="ROOT" value="logs/${PROJECT}/" />
    <property name="FILESIZE" value="50MB" />
    <property name="MAXHISTORY" value="100" />
    <timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss" />
    <!-- 控制台打印 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </encoder>
        <layout class="ch.qos.logback.classic.PatternLayout">
        <springProfile name="dev">
            <pattern>[%-5level]=== %d{${DATETIME}}=== [%thread]=== %logger{36}=== - %m%n
            </pattern>
        </springProfile>
        <springProfile name="!dev">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </springProfile>
        </layout>
    </appender>
    
    <!-- ERROR 輸入到文件,按日期和文件大小 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/error.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    
    <!-- WARN 輸入到文件,按日期和文件大小 -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    
    <!-- INFO 輸入到文件,按日期和文件大小 -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    <!-- DEBUG 輸入到文件,按日期和文件大小 -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    <!-- TRACE 輸入到文件,按日期和文件大小 -->
    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
            </pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>TRACE</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    
    <!-- SQL相關日志輸出-->
    <logger name="org.apache.ibatis" level="INFO" additivity="false" />
    <logger name="org.mybatis.spring" level="INFO" additivity="false" />
    <logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false" />
    
    <!-- Logger 根目錄 -->
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="DEBUG" />  
        <appender-ref ref="ERROR" />
        <appender-ref ref="WARN" />
        <appender-ref ref="INFO" /> 
        <appender-ref ref="TRACE" />
    </root>
</configuration>

  配置多個logback環境的核心代碼如下:

    <!-- 控制台打印 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="utf-8">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </encoder>
        <layout class="ch.qos.logback.classic.PatternLayout">
        <springProfile name="dev">
            <pattern>[%-5level]=== %d{${DATETIME}}=== [%thread]=== %logger{36}=== - %m%n
            </pattern>
        </springProfile>
        <springProfile name="!dev">
            <pattern>[%-5level]---> %d{${DATETIME}}---> [%thread]---> %logger{36}---> - %m%n
            </pattern>
        </springProfile>
        </layout>
    </appender>

 然后在application.properties配置文件中進行配置:

logging.level.com.zk=debug
logging.file=SpringBoot.log
logging.path=/spring/log

#logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{50} -%msg%n

#logging.pattern.file=%d{yyyy-MM-dd HH\:mm\:ss\:SSS} [%thread] %-5level %logger{50} -%msg%n

spring.profiles.active=prod

在logback-spring.xml中配置環境啟動,啟動后運行效果如下:

 

參考網址如下:https://blog.csdn.net/qq_37859539/article/details/82464745


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM