SpringBoot学习笔记-日志

SpringBoot学习笔记-日志

1 SpringBoot与日志

1.1 常见的日志框架

  • JUL: java.util.logging
  • JCL: Jakarta Commons Logging
  • JBoss-logging
  • logback
  • log4j
  • log4j2
  • slf4j: Simpe Logging Facade for java
日志的抽象层 日志实现
JCL,SLF4j,jboss-logging Log4j, JUL, Log4j2, Logback
  • 最常用的日志抽象层选择: SLF4j
  • 日志实现选择: Logback
  • SpringBoot底层是Spring框架, Spring框架默认使用JCL.
  • SpringBoot选用SLF4j和Logback

1.2 SLF4j使用

1.2.1 如何在系统中使用SLF4j

  • 导入slf4j的jar包和logback的实现jar包
  • 使用代码案例
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");
    }
}
  • 图示

concrete-bindings.png

1.2.2 遗留问题

  • 不同框架集成时, 不同的框架可能使用了不同的日志框架, 需要统一日志记录.
  • 将其他框架中其他日志框架先排除出去
  • 用适配包替换原来的日志接口包
  • 使用slf4j其他的实现
  • 图示

legacy.png

1.3 SpringBoot日志关系

  • SpringBoot底层也是使用 slf4j + logback 的方式进行日志记录.
  • SpringBoot也把其他的日志接口层替换成了slf4j接口层.
public abstract class LogFactory {

    static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";

    // 把工厂类换成了SLF4J工厂类
    static LogFactory logFactory = new SLF4JLogFactory();
}
  • 如果我们要引入其他框架,一定要把这个框架的默认日志依赖移除掉.以下是SpringBoot的用法.
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <exclusions>
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  • SpringBoot底层日志依赖关系图

legacy2.png

1.4 SpringBoot日志使用

  • 使用日志测试代码
package com.devinkin.springboot;

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 SpringBoot03LoggingApplicationTests {

    // 日志记录器
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    public void contextLoads() {
        //        System.out.println();
        // 日志的级别:由低到高
        // trace<debug<info<warn<error
        // 可以调整需要输出的日志级别: 日志就只会在这个级别及以后的高级别生效
        logger.trace("这是trace日志...");
        logger.debug("这是debug日志...");
        // SpringBoot默认使用的是info级别的, 没有指定级别的就使用SpringBoot默认规定的级别
        logger.info("这是info日志...");
        logger.warn("这是warn日志...");
        logger.error("这是error日志...");
    }

}
  • 设置日志的级别: logging.level
logging:
  level:
    com.devinkin: trace
  • 指定日志的文件名: logging.file ,会在当前项目下生成springboot.log日志
logging:
  file: springboot.log
  • 指定日志的文件的目录: logging.path , 日志文件名称使用SpringBoot默认的输出日志文件名.
    • 如果同时指定了 logging.file , 则使用 logging.file , 不会使用 logging.path
logging:
    path: /home/devinkin/JavaCode/WebBackEnd/SpringBoot/spring-boot-03-logging/log
  • 指定日志在控制台输出的格式: logging.pattern.console
logging:
  console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"
  • 指定文件中日志输出的格式: logging.pattern.file
logging:
  file: "%d{yyyy-MM-dd HH:mm:ss.SSS} === [%thread] === %-5level === %logger{50} === %msg%n"
  • 日志的输出格式
符号 含义
%d 表示日期时间
%thread 表示线程名
%-5level 表示logger名字最长50字符,否则按照句点分割
%msg 日志消息
%n 换行符

1.5 SpringBoot指定日志文件的配置

  • 在类路径下放每个日志框架自己的配置文件即可, SpringBoot就不使用它默认日志配置文件
Logging System Customization
Logback logback.spring.xml, logback.spring.groovy, logback.xml, logback.groovy
Log4j2 log4j2.spring.xml, log4j2.xml
JDK(Java Util Logging) logging.properties
  • 带spring后缀名, 日志框架就会被SpringBoot加载, 就能使用SpringBoot的高级功能. <springProfile>
    • 在开发环境下的输出格式和非开发环境下的输出格式
<springProfile name="dev">
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
</springProfile>
  • 设置SpringBoot为开发环境下运行
spring:
  profiles:
    active: dev

1.6 SpringBoot切换日志框架

  • 可以按照slf4j的日志适配图,进行相关的切换
  • 使用 slf4j + log4j 的方式
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>logback-classic</artifactId>
            <groupId>ch.qos.logback</groupId>
        </exclusion>
        <exclusion>
            <artifactId>log4j-over-slf4j</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
  • 切换为log4j2框架
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <artifactId>spring-boot-starter-logging</artifactId>
      <groupId>org.springframework.boot</groupId>
    </exclusion>
  </exclusions>
</dependency>

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

Date: 2018-11-24 19:49

Author: devinkin

Created: 2018-11-25 日 00:18

Validate

猜你喜欢

转载自www.cnblogs.com/devinkin/p/10014309.html