2.1 日志框架

2.1.1 基本介绍

  • 市面上有的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j …. | 日志门面 (日志的抽象层) | 日志方法(日志的实现层) | | :—-: | :—-: | | JCL(Jakarta Commons Logging)
    SLF4j(Simple Logging Facade for Java)
    jboss-loggi | JUL(java.util.logging)
    Log4j
    Log4j2 (Apache 开发的)
    Logback(比 log4j 性能更好) |

  • 使用:开发时有关日志记录方法的调用,不应该直接调用日志的实现类,而应该调用日志抽象层里面的方法;

    2.1.2 SLF4j 背景

  • 完整介绍可参考 slf4j 官网

  • slf4j 及与各实现框架的适配实现

    • 注:每一个日志的实现框架都有自己的配置文件,使用 slf4j 以后,配置文件还是做成日志实现框架自己本身的配置文件;

      2. springboot 日志 - 图1

  • slf4j + logback 实现

    1. //jar 包准备:从 pom.xml 中导入 slf4j 的 jar 和 logback 的实现 jar;
    2. import org.slf4j.Logger;
    3. import org.slf4j.LoggerFactory;
    4. public class HelloWorld {
    5. public static void main(String[] args) {
    6. Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    7. logger.info("Hello World");
    8. }
    9. }
  • 使用 slf4j 统一系统日志

    • 项目中可能依赖不同的框架,其所用的日志可能不同,如 Spring(commons-logging)、Hibernate(jboss-logging)、MyBatis……
    • 解决方案:将项目中用到的多种日志 API 中间使用 SLF4J 或第三方提供的日志适配器统一适配到 SLF4J;
      • “适配”的本质:将系统中其他日志框架先排除出去,用中间包来替换原有的日志框架(适配器的类名和包名与替换的被日志框架一致),然后导入 slf4j 其他的实现;

2. springboot 日志 - 图2

2.1.3 spring boot 对 SEL4J 的使用

  • SpringBoot 使用 sel4j 来做日志功能

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-logging</artifactId>
    4. </dependency>
  • spring boot 日志工具包特点

    • SpringBoot 底层使用 slf4j+logback 的方式进行日志记录;
    • SpringBoot 能自动适配所有日志,通过中间替换包把其他的日志都替换成 slf4j;
    • 在引入其他框架时,需要把这个框架的默认日志依赖移除掉,如 Spring 框架使用 commons-logging;
                 <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-core</artifactId>
             <exclusions>
                 <exclusion>
                     <groupId>commons-logging</groupId>
                     <artifactId>commons-logging</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
      
  • 使用

    • 使用1-使用记录器 logger 打印不同级别的日志信息; ```java package com.cyt.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 SpringBootLoggingApplicationTests {

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

@Test
public void contextLoads() {
    //日志的级别,由低到高 trace->debug->info->warn->error
    //可以调整输出的日志级别,日志就只会打印不低于这个级别的日志信息
    //spring boot 默认使用 info 级别
    logger.trace("这是 trace 日志");
    logger.debug("这是 debug 日志");
    logger.info("这是 info 日志");
    logger.warn("这是 warn 日志");
    logger.error("这是 error 日志");
}

}


   - 使用2-在 application.properties 中修改日志的默认配置;
```java
# 1. 配置可以输出的日志级别
logging.level.root=error #也可以指定一个包路径,eg:logging.level.com.cyt=error

# 2. 配置日志文件的输出路径,默认输出在当前 console 控制台
# 注意:logging.path 和 logging.file 二者选一使用;
logging.file=G:/springboot.log #不指定路径的话默认在在当前项目路径下生成 springboot.log 日志
logging.path=/spring/log #在当前磁盘的根路径下创建spring文件夹和里面的log文件夹,且使用 spring.log 作为默认文件

# 3. 配置输出的日志格式
# 3.1 在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 3.2 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
# 3.3 补充:日志输出格式->
            %d表示日期时间,
            %thread表示线程名,
            %-5level:级别从左显示5个字符宽度
            %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
            %msg:日志消息,
            %n是换行符->
  • 使用3-在类路径下自定义日志配置文件,会覆盖 SpringBoot 的默认配置;

    • 配置文件命名如下所示,推荐使用 xx-spring.xml,可以使用 spring 的高级功能; | Logging System | Customization | | —- | —- | | Logback | logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy | | Log4j2 | log4j2-spring.xml or log4j2.xml | | JDK (Java Util Logging) | logging.properties |

    • logback.xml 和 logback-spring.xml 的区别

      • logback.xml 会直接就被日志框架识别然后使用;
      • logback-spring.xml:会由 SpringBoot 解析日志并配置,可使用 SpringBoot 的高级 Profile 功能等;
      • 案例:在 logback-spring.xml 中配置不同开发环境选用不同的日志输出格式
        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
         <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>
        </layout>
        </appender>Copy to clipboardErrorCopied
        

image.png