SpringBoot日志记录

1、基本市场上的日志类型

日志门面(日志的抽象层)

日志实现

JCL(jakata Commons logging) 、SLF4j(Simple Logging Facade for java)、jboss-logging

Log4jJUL(java.util.logging) ,log4j2

左边选择一个门面(抽象层),右边来选一个实现。
日志门面:SLF4j(Simple Logging Facade for java)
日志实现:logback ;

SpringBoot:中选择了SLF4j+logback

2、SLF4j的使用

1、如何使用SLF4j

以后开发的时候,日志的记录方法的调用。不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法。

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");
  }
}

官方提供的SLF4j的调用方法

springboot jvm打印gc日志 spring boot gc日志_配置文件


绿色的都是适配层、深蓝的都是需要导入的包。

每一个日志的实现框架都有自己的配置文件,而这些配置文件还是做成日志实现框架本身的配置文件2、遗留问题

多个框架有多种日志配置文件,需要替换掉之前的jar包。用新的替换包来代替原来的包。

springboot jvm打印gc日志 spring boot gc日志_配置文件_02


如何让系统中所有的日志都统一到slf4j:

  • 1将系统中其他日志框架先排除
  • 2把替换的包放入框架中
  • 3导入slf4j的其他实现

3、SpringBoot日志关系

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.1.7.RELEASE</version>
      <scope>compile</scope>
</dependency>
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.1.7.RELEASE</version>
      <scope>compile</scope>
    </dependency>

可以看到spring-boot-starter-logging中有三个转换的选择

springboot jvm打印gc日志 spring boot gc日志_xml_03

我们可以看到中间的转换包

springboot jvm打印gc日志 spring boot gc日志_java_04

public class SLF4JBridgeHandler extends Handler {
    private static final String FQCN = Logger.class.getName();
    private static final String UNKNOWN_LOGGER_NAME = "unknown.jul.logger";
    private static final int TRACE_LEVEL_THRESHOLD;
    private static final int DEBUG_LEVEL_THRESHOLD;
    private static final int INFO_LEVEL_THRESHOLD;
    private static final int WARN_LEVEL_THRESHOLD;

    public static void install() {
        LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());
    }

    private static Logger getRootLogger() {
        return LogManager.getLogManager().getLogger("");
    }
  • 4、所以当我们引入了其他框架,我们一定要把这个框架的默认日志依赖移除掉

4、默认的日志

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootAutoconfigApplicationTests {
    //记录器
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    public void contextLoads() {
        /**
         * 日志的级别就是按照这个顺序
         * 可以手动调整输出的日志级别
         */
        logger.trace("trace日志");
        logger.debug("debug日志");
        //sb中默认给我们使用info级别的日志,没有指定级别,就使用默认的root级别
        logger.info("info日志");
        logger.warn("warn日志");
        logger.error("error日志");
    }

}

我们可以在properties中修改日志的输出级别

logging.level.com.atlyb=trace
日志的输出格式:
		%的表示日期时间,
		%thread表示线程名,
		%-5level:日志的级别
		%logger(50)表示logger名字最长50个字符,否则按照句点分割
		%msg 日志的内容
		%n 换行
		%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger(50) - %msg%n
logging.level.com.atlyb=trace

#loggong.path
#不指定路径在当前项目下生成sb.log日志
#可以指定完整的路径
#logging.file=D:/loggsb.log
#在当前磁盘的根部路线创建spring文件夹和里边的log文件夹使用默认的spring.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} ||||  [%thread] ||||  %-5level ||||  %logger(50) |||| %msg%n

我们也可以看看springboot的默认设置

springboot jvm打印gc日志 spring boot gc日志_java_05

<?xml version="1.0" encoding="UTF-8"?>

<!--
Default logback configuration provided for import, equivalent to the programmatic
initialization performed by Boot
-->

<included>
	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
	<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
	<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

	<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
	<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
	<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
	<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
	<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
	<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
	<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
</included>
public class LoggingSystemProperties {
    public static final String PID_KEY = "PID";
    public static final String EXCEPTION_CONVERSION_WORD = "LOG_EXCEPTION_CONVERSION_WORD";
    public static final String LOG_FILE = "LOG_FILE";
    public static final String LOG_PATH = "LOG_PATH";
    public static final String CONSOLE_LOG_PATTERN = "CONSOLE_LOG_PATTERN";
    public static final String FILE_LOG_PATTERN = "FILE_LOG_PATTERN";
    public static final String FILE_MAX_HISTORY = "LOG_FILE_MAX_HISTORY";
    public static final String FILE_MAX_SIZE = "LOG_FILE_MAX_SIZE";
    public static final String LOG_LEVEL_PATTERN = "LOG_LEVEL_PATTERN";
    public static final String LOG_DATEFORMAT_PATTERN = "LOG_DATEFORMAT_PATTERN";
    private final Environment environment;

根据上一张所讲述的。这里我们看到了logging中的所有properties

自定义配置文件

同样很简单,我们自定义一个logback.xml,然后放在根文件。则会使用我们的配置文件

Logging System

Customization

Logback

logback-spring.xml;logback-spring.groovy;logback.xml ;logback.groovy

log4j2

log4j2-spring.xml ;log4h.xml

JDK

logging.properties

logback.xml 这种系统就直接识别了

然而如果使用spring-boot的功能,推荐使用logback-spring.xml,这种方式,比如:

//我们可以通过
<SpringProfile name='dev'></SpringProfile >
<SpringProfile name='!dev'></SpringProfile >
/*这种方式来规定日志的输出环境*/