0
点赞
收藏
分享

微信扫一扫

springboot2原理实战(19)--日志配置


文章目录

  • ​​目录:​​
  • ​​一、日志级别​​
  • ​​了解默认级别:​​
  • ​​2.设置日志级别为debug​​
  • ​​①修改某个类的日志级别​​
  • ​​②修改所有的类的日志级别:​​
  • ​​2.排除源码的日志​​
  • ​​3.关闭日志输出​​
  • ​​二、日志文件输出​​
  • ​​三.springboot 也支持log4j或者log4j2​​
  • ​​1.使用logback.xml设置日志​​
  • ​​2. 使用其他的日志组件的步骤​​
  • ​​四、源码中的默认日志模板​​

目录:

本文主要来了解下springboot2的日志配置

springboot2原理实战(19)--日志配置_spring

一、日志级别

springboot默认使用的日志是logback,日志级别有很多,我们看下这个类LogLevel :

package org.springframework.boot.logging;

/**
* Logging levels supported by a {@link LoggingSystem}.
*
* @author Phillip Webb
* @since 1.0.0
*/
public enum LogLevel {

TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF

}

可以看到 日志级别有: trace debug info warn error fetal off。日志级别从trace(跟踪)到FATAL(致命)依次级别变高的。off是关闭日志。

了解默认级别:

做个试验,看下springboot默认使用的是哪种级别:
写个类打印日志:

@Component
public class UserService {

private Logger log = LoggerFactory.getLogger(this.getClass());

public void log(){
log.debug("user service debug log");
log.info("user service info log");
log.warn("user service warn log");
log.error("user service error log");
}

}

入口函数调用log方法:

@SpringBootApplication
public class Demo19Application {

public static void main(String[] args) {
// ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
context.getBean(UserDao.class).log();
System.out.println("=====================================================================");
context.close();
}

}

运行结果如下:

springboot2原理实战(19)--日志配置_spring boot_02


可以看到默认的日志级别是info开始的。

我们一般开发中经常是使用debug级别,生成环境中是从info开始,所以设置下日志级别:

2.设置日志级别为debug

可以通过logging.level.*=DEBUG来设置,可以是包,也可以是某个类

①修改某个类的日志级别

  • 修改​​application.properties​

# root表示所有的类
#logging.level.com.springboot.demo19.dao=Debug

再次运行入口函数:

@SpringBootApplication
public class Demo19Application {

public static void main(String[] args) {
// ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
context.getBean(UserDao.class).log();
System.out.println("=====================================================================");
// context.getBean(UserService.class).log();
context.close();
}

}

如下图:userDao的日志级别已经修改成了debug级别:

springboot2原理实战(19)--日志配置_日志文件_03


刚才配置文件是指向了类,还可以指向包,也可指向全部使用root。现在演示所有的类的日志级别,都改成debug。

②修改所有的类的日志级别:

修改成root不仅可以打印自己写的类,也可以打印出springboot源码中类的日志。

  • 修改​​application.properties​

# root表示所有的类
logging.level.root=Debug

@Component
public class UserService {

private Logger log = LoggerFactory.getLogger(this.getClass());

public void log(){
log.debug("user service debug log");
log.info("user service info log");
log.warn("user service warn log");
log.error("user service error log");
}

}

@Component
public class UserDao {

private Logger log = LoggerFactory.getLogger(this.getClass());

public void log(){
log.debug("user dao debug log");
log.info("user dao info log");
log.warn("user dao warn log");
log.error("user dao error log");
}


}

@SpringBootApplication
public class Demo19Application {

public static void main(String[] args) {
// ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
context.getBean(UserDao.class).log();
System.out.println("=====================================================================");
context.getBean(UserService.class).log();
context.close();
}

}

运行结果:

springboot2原理实战(19)--日志配置_日志_04


可以看到全部的类的日志的debug级别的日志开始都打印出来了。

这里如果想要只打印springboot的自己debug的日志,不打印我们的,可以
​​​// ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");​​​ 打开这行代码
并且去掉application.properties的那行root的配置

@SpringBootApplication
public class Demo19Application {

public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
context.getBean(UserDao.class).log();
System.out.println("=====================================================================");
context.getBean(UserService.class).log();
context.close();
}

}

可看到,上面的是springboot的debug级别的日志,下面使我们自己写的info日志级别的日志。

springboot2原理实战(19)--日志配置_日志_05

2.排除源码的日志

如果想排除springboot源码中某个类的debug的日志,可以在注解上设置

@SpringBootApplication(exclude = WebServicesAutoConfiguration.class)
public class Demo19Application {

public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
// ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
context.getBean(UserDao.class).log();
System.out.println("=====================================================================");
context.getBean(UserService.class).log();
context.close();
}

}

这里我们使用​​@SpringBootApplication(exclude = WebServicesAutoConfiguration.class)​​,排除了这个类的日志,本质上是不自动配置这个类了,头脑要灵活,不能被限制在日志的圈子里。

3.关闭日志输出

关闭其实很简单,可以关闭某个类或者某个包下的日志:
application.properties

logging.level.com.springboot.demo19.dao=OFF
logging.level.com.springboot.demo19.service=DEBUG

看下还有没有userdao的日志:

@SpringBootApplication(exclude = WebServicesAutoConfiguration.class)
public class Demo19Application {

public static void main(String[] args) {
// ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, "--debug");
ConfigurableApplicationContext context = SpringApplication.run(Demo19Application.class, args);
context.getBean(UserDao.class).log();
System.out.println("=====================================================================");
context.getBean(UserService.class).log();
context.close();
}

}

springboot2原理实战(19)--日志配置_spring_06


userdao的所有的日志都不打印了。

二、日志文件输出

配置属性在这个类org.springframework.boot.context.logging.LoggingApplicationListener

springboot2原理实战(19)--日志配置_spring_07


这个类中有LogFile这个类:

springboot2原理实战(19)--日志配置_xml_08


配置属性都在这个类里:

springboot2原理实战(19)--日志配置_spring_09


application.properties可以设置文件路径地址和 控制台输出的格式,日志文件格式

​logging.file.path=e:/tmp/my.log 指定文件路径地址​​ 日志文件输出,文件的大小10M之后,就会分割了。

指定文件输出格式:
​​​logging.pattern.console //配置控制台输出日志的pattern​​​​logging.pattern.file //配置日志文件输出日志的pattern​

更多配置信息:看下这个博客​​https://www.jianshu.com/p/1fa12b92d5c4​​

三.springboot 也支持log4j或者log4j2

1.使用logback.xml设置日志

springboot默认支持logback
也就是说,只需要在classpath下放一个logback.xml.logback-spring.xml的文件,即可定制日志的输出
logback.xml 例子如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="E:\\logs\\projectname" />

<!-- 控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 1格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--临界值日志过滤级别配置 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!-- 1在日志级别的基础上过滤掉trace级别以下的日志 -->
<level>trace</level>
</filter>
</appender>

<!-- trace级别,按照每天生成日志文件 -->
<appender name="trace" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\trace-log-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>trace</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- debug级别,按照每天生成日志文件 -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\debug-log-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- info级别,按照每天生成日志文件 -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\info-log-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- warn级别,按照每天生成日志文件 -->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\warn-log-%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- <file>D:\logs\logback.%d{yyyy-MM-dd}.log</file> -->
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>

<!-- error级别,按照每天生成日志文件 -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}\error-log-%d{yyyy-MM-dd}.log</FileNamePattern>

<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<!--只保留固定配置级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>


<!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
<!-- 日志输出级别 -->
<root level="trace">
<appender-ref ref="stdout" />
<appender-ref ref="trace" />
<appender-ref ref="debug" />
<appender-ref ref="info" />
<appender-ref ref="warn" />
<appender-ref ref="error" />
</root>
</configuration>

2. 使用其他的日志组件的步骤

1:排除掉默认的日志组件: spring-boot-starter-logging
2: 加入新的日志路径依赖
3;吧响应的配置文件放到classpath下 名字可以是 logback.xml 或者logback-spring.xml

第1 、 2步

<dependencies>
<!-- 默认添加了日志依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--排除logback的依赖-->
<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>
<version>1.4.0.RELEASE</version>
</dependency>

第3步在classpath下放一个log4j2-spring.xml活log4j.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

设置成debug模式

四、源码中的默认日志模板

在\org\springframework\boot\spring-boot\2.2.5.RELEASE\spring-boot-2.2.5.RELEASE.jar

springboot2原理实战(19)--日志配置_日志文件_10


可以看到log4j2和logback的默认的xml模板和一些配置

比如从这里可以看到logback默认是使用的info日志级别。

springboot2原理实战(19)--日志配置_spring_11


file-appender.xml 设置的是默认的文件格式信息:

springboot2原理实战(19)--日志配置_xml_12

本文主要了解了springboot的日志设置,比如日志级别,修改默认日志级别,内置的日志有log4j2和logback,如何切换日志,用xml配置日志等。

个人微信公号:

搜索: 怒放de每一天

不定时推送相关文章,期待和大家一起成长!!

springboot2原理实战(19)--日志配置_日志_13


举报

相关推荐

0 条评论