SpringBoot中常见的日志框架

SpringBoot中常见的日志框架


日志级别

  • TRACE:最低级别的日志,用于追踪程序的细节信息。
  • DEBUG:用于调试程序时输出详细的日志信息,通常会包含一些变量的值和方法的执行情况。
  • INFO:用于输出程序运行时的一般性信息,如启动、停止等重要事件的日志。
  • WARN:用于输出警告信息,表示可能存在潜在的问题或错误,但并不影响程序的正常运行。
  • ERROR:用于输出错误信息,表示发生了可恢复的错误,可能导致程序异常或中断。
  • FATAL:最高级别的日志,用于输出严重的错误信息,表示发生了无法恢复的严重错误,可能导致程序崩溃。

一、默认的日志框架Logback

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

默认情况下,Spring Boot 使用 logback 作为应用日志框架。在使用 Spring Boot 时,推荐导入 spring-boot-starter-logging 依赖,因为它会根据 Spring Boot 的规则进行日志框架的自动配置,并确保与 Spring Boot 的其他模块协同工作。

配置文件:

Logback的配置文件通常命名为logback.xml,它控制了日志记录方式、级别和输出目标。在Spring Boot项目中,可以将logback.xml文件放置在src/main/resources目录下。

logback.xml 配置示例:

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

    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 设置根日志级别为INFO,继承给所有logger -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

配置日志级别:

默认情况下,Spring Boot 配置 ERROR, WARN, INFO 三种日志级别。如果需要 Debug 级别的日志。在 src/main/resources/application.yml中配置数据源信息。

logging.level.root=INFO
logging.level.org.springframework.web=DEBUG

二、常用的日志框架 Log4j

  • Log4j: Log4j 是一个广泛使用的日志框架,具有丰富的特性和灵活的配置。它支持多种输出目标(控制台、文件、数据库等)和多种日志级别,可以根据需求进行定制。然而,Log4j 1.x 版本在性能方面存在一些瓶颈,并且已经不再被官方维护。

  • Log4j2: Log4j2 是 Log4j 的最新版本,采用了全新的架构,性能比 Log4j 1.x 更优。它支持异步日志和插件化输出器,提供更高级别的配置和更好的性能。Log4j2 逐渐取代 Log4j 成为 Java 项目中常用的日志框架之一。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Spring Boot 集成 log4j2 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

配置文件:

application.yml:

logging:
  config: classpath:log4j2-dev.xml

log4j2-dev.xml配置示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="180" packages="">
    <properties>
        <property name="logdir">logs</property>
        <property name="PATTERN">%date{YYYY-MM-dd HH:mm:ss,SSS} %level [%thread][%file:%line] - %msg%n%throwable</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN}"/>
        </Console>

        <RollingFile name="ErrorAppender" fileName="${logdir}/error.log"
            filePattern="${logdir}/$${date:yyyy-MM-dd}/error.%d{yyyy-MM-dd-HH}.log" append="true">
            <PatternLayout pattern="${PATTERN}"/>
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <RollingFile name="DebugAppender" fileName="${logdir}/info.log"
            filePattern="${logdir}/$${date:yyyy-MM-dd}/info.%d{yyyy-MM-dd-HH}.log" append="true">
            <PatternLayout pattern="${PATTERN}"/>
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
        
        <!--异步appender-->
         <Async name="AsyncAppender" includeLocation="true">
            <AppenderRef ref="ErrorAppender"/>
            <AppenderRef ref="DebugAppender"/>
        </Async>
    </Appenders>
    
    <Loggers>
         <!--过滤掉spring和mybatis的一些无用的debug信息
        <logger name="org.springframework" level="INFO">
        </logger>
        <logger name="org.mybatis" level="INFO">
        </logger>-->
        <logger name="cn.itcast.wanxinp2p.consumer.mapper" level="DEBUG">
        </logger>

        <logger name="springfox" level="INFO">
        </logger>
      <logger name="org.apache.http" level="INFO">
        </logger>
        <logger name="com.netflix.discovery" level="INFO">
        </logger>
        
        <logger name="RocketmqCommon"  level="INFO" >
      </logger>
      
      <logger name="RocketmqRemoting" level="INFO"  >
      </logger>
      
      <logger name="RocketmqClient" level="WARN">
      </logger>

        <logger name="org.dromara.hmily" level="WARN">
        </logger>

        <logger name="org.dromara.hmily.lottery" level="WARN">
        </logger>

        <logger name="org.dromara.hmily.bonuspoint" level="WARN">
        </logger>
      
        <!--OFF   0-->
        <!--FATAL   100-->
        <!--ERROR   200-->
        <!--WARN   300-->
        <!--INFO   400-->
        <!--DEBUG   500-->
        <!--TRACE   600-->
        <!--ALL   Integer.MAX_VALUE-->
        <Root level="DEBUG" includeLocation="true">
            <AppenderRef ref="AsyncAppender"/>
            <AppenderRef ref="Console"/>
            <AppenderRef ref="DebugAppender"/>
        </Root>
    </Loggers>
</Configuration>

三、日志门面Slf4j

Slf4j, 全称为 Simple Logging Facade for Java,即 java 简单日志门面。作者又是 Ceki Gulcu!这位大神写了 Log4j、Logback 和 Slf4j。类似于 Common-Logging,Slf4j 是对不同日志框架提供的一个 API 封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,Slf4j 在编译时静态绑定真正的 Log 库。使用 Slf4J 时,如果你需要使用某一种日志实现,那么你必须选择正确的 Slf4J 的 jar 包的集合(各种桥接包)。Slf4J 本身不提供日志的实现。

门面框架和实现框架:
有点类似于接口和实现类的关系,门面框架和实现框架其实就是这样的关系:提供通用的日志 API 给调用方,而自己去实现不同日志框架的适配,这种设计模式叫做 外观模式,MySQL 的驱动设计其实也是这种思想。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
</dependency>
  • 在 Spring Boot 中,集成 SLF4J 和 Logging 或 Log4j2的方式是非常常见的。这样做的原因是为了实现日志框架的解耦和灵活切换。
  • Lombok 是一个 Java 库,它通过注解简化了 Java 代码的编写。其中包括一个 @Slf4j
    注解,用于自动生成日志记录器(Logger)字段,以便在代码中直接使用日志记录器进行日志输出。@Slf4j注解会根据所选的日志框架,在编译期间自动生成相应的日志记录器实例。

使用 Slf4J 与具体的日志框架集成(如 Logging 或 Log4j2)有以下好处:

  • 解耦性:通过 Slf4J,代码与具体的日志框架解耦,可以方便地切换底层的日志实现,无需对代码进行大规模修改。

  • 统一API:使用 Slf4J 提供的统一日志 API,可以在代码中使用相同的日志记录方式,无论使用哪个具体的日志框架。

  • 配置灵活性:使用 Slf4J 可以更灵活地配置日志框架,如设置日志级别、输出格式等。

四、MyBatis-Plus的日志配置:

Slf4J通过调用不同的日志实现库(如Log4j2)来输出日志,可以灵活切换底层的日志实现。
MyBatis-Plus的日志输出主要针对SQL语句的执行情况,可配置的输出内容包括SQL语句、参数和执行结果等。

<dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.4.2</version>
    </dependency>

配置文件:

Application.yml:

mybatis-plus:
  configuration:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

控制台打印结果:

  • MyBatis-Plus的输出日志:
    在这里插入图片描述
  • DEBUG级别下SLF4J输出的日志:
    在这里插入图片描述

注意事项:

  1. logging:
  • spring-boot-starter-logging是Spring Boot中默认的日志框架。
  • logging提供了一种简单的方式来记录日志,并支持多种日志实现,如Java Util Logging (JUL)、Log4j、Log4j2和Logback等。
  • 它提供了一组通用的日志接口和简单的配置,但在功能上相对较少,并且缺少一些高级特性。
  1. slf4j (Simple Logging Facade for Java):
  • slf4j是一种抽象层,允许应用程序使用统一的API来记录日志,而不依赖具体的日志实现。
  • 它提供了一组简单的接口,可以与多种后端日志框架集成,如log4j、logback等。
  • 使用slf4j可以在不改变代码的情况下切换日志实现。
  1. log4j:
  • log4j是一个功能丰富的日志框架,提供了广泛的设置和配置选项。
  • 它支持多种输出目标(如控制台、文件、数据库等)和灵活的日志级别设置。
  • log4j还具有高度可定制性和优秀的性能。

为什么log4j和logging不能共存:

log4j和logging都是用于日志记录的框架,它们有不同的日志实现和配置方式。

当log4j和logging两者同时存在时,可能会出现以下问题:

  1. 冲突:log4j和logging可能会尝试分别初始化和配置日志系统,导致冲突和不一致的行为。
  2. 重复输出:日志消息可能会被同时输出到log4j和logging的日志系统中,导致重复的日志记录。
  3. 性能问题:同时加载和初始化两个日志系统会增加资源消耗和性能开销。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值