Springboot 开发 -- 日志框架总结及实践

一、Java 日志框架简介

Java 日志框架主要分为两类:日志门面和具体的日志实现。
在这里插入图片描述

1. 日志门面

日志门面提供了统一的日志接口,使得开发者可以灵活地更换底层的日志框架而无需修改代码。常见的日志门面有:

  • Jakarta Commons Logging (JCL):只支持 JUL 和 Log4j。
  • Simple Logging Facade for Java (SLF4J):支持几乎所有主流的日志框架。

2. 日志实现

日志实现框架提供了具体的日志记录功能。常见的实现有:

  • Java Util Logging (JUL):JDK 自带的日志实现。
  • Log4j:由 Apache 软件基金会提供,是最早的日志框架之一。
  • Logback:由 Log4j 的创始人设计,性能优化,支持 SLF4J。
  • Log4j2:Log4j 的升级版,重新架构,性能和特性上有显著提升。

3.日志级别

使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。不同的日志实现定义的日志级别不太一样,不过也都大同小异。

  1. Java Util Logging

Java Util Logging 定义了 7 个日志级别,从严重到普通依次是:

  • SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST

  • 因为默认级别是 INFO,因此 INFO 级别以下的日志,不会被打印出来。

  1. Log4j

Log4j 定义了 8 个日志级别(除去 OFF 和 ALL,可以说分为 6 个级别),从严重到普通依次是:

  • OFF:最高等级的,用于关闭所有日志记录。
  • FATAL:重大错误,这种级别可以直接停止程序了。
  • ERROR:打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
  • WARN:警告提示。
  • INFO:用于生产环境中输出程序运行的一些重要信息,不能滥用。
  • DEBUG:用于开发过程中打印一些运行信息。
    TRACE
  • ALL 最低等级的,用于打开所有日志记录。
  1. Logback

Logback 日志级别比较简单,从严重到普通依次是:

  • ERROR、 WARN、INFO、DEBUG、TRACE

二、 Spring Boot默认日志框架

Spring Boot默认使用的日志框架是SLF4J+Logback。这个组合是当下的最优选择,原因如下:

  • SLF4J是日志接口规范,可以通过配置不同的桥接器,来为项目接入不同的日志框架。更改日志框架无需改动代码。
  • Logback是由log4j创始人设计的又一个开源日志组件,在性能和架构上较log4j有着很大程度上的改进,并且logback是Spring Boot框架(1.x和2.x)默认集成的日志实现框架
  • Log4j2是对log4j的升级,提供了重要的改进,并提供了Logback中可用的许多改进,同时修复了Logback体系结构中的一些固有问题。可以认为log4j2是logback的加强版

打开一个SpringBoot应用的pom.xml 文件,可看到其中导入 了spring-boot-starter-web 依赖;

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

spring-boot-starter-web 依赖中包含 spring-boot-stater 依赖;

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

spring-boot-stater 依赖中包含 spring-boot-starter-logging 依赖用于配置日志相关;

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

查看 spring-boot-starter-logging 的 pom 发现依赖于如下:
在这里插入图片描述
其中:

  • logback-classic:
    这是一个具体的日志框架,即 Logback 的经典版本。Logback 是 SLF4J(Simple Logging Facade for Java)的一个实现,它提供了高效的日志记录功能。
  • log4j-to-slf4j:
    这个依赖用于将 Log4j 的日志调用重定向到 SLF4J。
  • jul-to-slf4j:
    这个依赖用于将 Java 自带的日志系统(java.util.logging,简称 JUL)的日志调用重定向到 SLF4J。

在这里插入图片描述

三、 Spring Boot默认日志框架 Logback 集成

1.引入 spring-boot-starter-logging

pom 文件添加:

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

spring-boot-starter 中已经引入了 spring-boot-starter-logging ,我们可以直接在项目中使用 spring-boot-starter

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

2. Logback配置文件加载顺序

在logback框架读取日志配置文件的优先级从高到低依次是:

日志加载顺序:logback.xml > application.properties > logback-spring.xml

配置文件的最佳选择

  • logback.xml:来配置日志框架,该配置文件可直接就被日志框架识别了;一般情况不推荐

  • logback-spring.xml日志框架不直接加载日志的配置项由SpringBoot解析日志配置Spring Boot 官方推荐优先使用带有 -spring 的文件名作为你的日志配置。命名为 logback-spring.xml 的日志配置文件,可以为它添加一些 spring boot 特有的配置项。

3. logback-spring.xml 配置实例

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--定义日志文件的存储地址,使用Spring的属性文件配置方式-->
    <springProperty scope="context" name="log.home" source="log.home" defaultValue="logs"/>

    <!--定义日志文件的路径-->
    <property name="LOG_PATH" value="${log.home}"/>

    <!--定义控制台输出-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%-5relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--定义 INFO 及以上级别信息输出到控制台-->
    <root level="INFO">
        <appender-ref ref="console"/>
    </root>

    <!--定义所有组件的日志级别,如所有 DEBUG-->
    <logger name="com.example" level="DEBUG"/>

    <!-- date 格式定义 -->
    <property name="LOG_DATEFORMAT" value="yyyy-MM-dd"/>

    <!-- 定义日志归档文件名称格式,每天生成一个日志文件 -->
    <property name="ARCHIVE_PATTERN" value="${LOG_PATH}/%d{${LOG_DATEFORMAT}}/app-%d{${LOG_DATEFORMAT}}-%i.log.gz"/>

    <!--定义文件输出,会根据定义的阈值进行切割,支持自动归档压缩过期日志-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--定义日志文件切割的阈值,本例是 50MB-->
            <maxFileSize>50MB</maxFileSize>
            <!--定义日志文件保留时间,本例是每天生成一个日志文件-->
            <fileNamePattern>${ARCHIVE_PATTERN}</fileNamePattern>
            <maxHistory>30</maxHistory>
            <!-- zip 压缩生成的归档文件 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 删除过期文件 -->
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--定义 ERROR 级别以上信息输出到文件-->
    <logger name="com.example.demo" level="ERROR" additivity="false">
        <appender-ref ref="file"/>
    </logger>

    <!--异步输出日志信息-->
    <appender name="asyncFile" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>256</queueSize>
        <appender-ref ref="file"/>
    </appender>

    <!--定义INFO及以上级别信息异步输出到文件-->
    <logger name="com.example" level="INFO" additivity="false">
        <appender-ref ref="asyncFile"/>
    </logger>

</configuration>

4. application.yml 配置文件实现日志配置

############## logback 日志自定义配置 ############## 
logging:
  level:
    root: info
    com.dz.demo.controller: debug
  file:
    path: D:\logs
    name: D:\logs\boot-launch.log
    max-size: 10MB
    max-history: 180
  pattern:
    console: '%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)'
    file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger : %msg%n'
  • logging.level.root=info #指定整个系统的默认日志级别是info,日志级别统一化
  • logging.level.com.dz.demo.controller=debug #指定某个特定的package的日志级别是debug,日志级别个性化。优先级角度,个性配置大于统一配置
  • logging.file.path #将日志输出到指定目录,如果不指定logging.file.name,日志文件的默认名称是spring.log。配置了 logging.file.name之后,logging.file.path配置失效。
  • 无论何种设置,Spring Boot都会自动按天分割日志文件,也就是说每天都会自动生成一个新的log文件,而之前的会自动打成GZ压缩包。# 日志文件大小
  • logging.file.max-size=10MB #分割的每个日志的文件最大容量,超过这个size之后日志继续分隔。
  • logging.file.max-history=180 #设置保留的日志时间以天为单位
  • logging.pattern.file #输出到文件中的日志的格式
  • logging.pattern.console #控制台输出日志的格式,控制台调试时候显示效果更清晰,为日志增加了颜色。red、green等等

日志格式占位符
配合这张图,看一下占位符和logging.pattern.console格式配置之间的关系
在这里插入图片描述

  • %d{HH:mm:ss.SSS}:日志输出时间(red)
  • %thread:输出日志的进程名字,这在Web应用以及异步任务处理中很有用 (green)
  • %-5level:日志级别,并且使用5个字符靠左对齐 (highlight高亮蓝色)
  • %logger:日志输出类的名字 (boldMagenta粗体洋红色)
  • %msg:日志消息 (cyan蓝绿色)
  • %n:平台的换行符

四、日志使用

  1. 在使用 SLF4J 进行日志记录时,通常都需要在每个需要记录日志的类中定义 Logger 变量,如下所示:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@RestController
public class LogController {
    private static final Logger logger = LoggerFactory.getLogger(LogController.class);

    @GetMapping("/test")
    public void test(){
        logger.trace("Trace 日志...");
        logger.debug("Debug 日志...");
        logger.info("Info 日志...");
        logger.warn("Warn 日志...");
        logger.error("Error 日志...");
    }
}
  1. 当我们在项目中引入了 Lombok,可以使用它提供的 @Slf4j 注解来自动生成上面那个变量,默认的变量名是 log
@Slf4j
@RestController
public class LogController {
   
    @GetMapping("/test")
    public void test(){
        log.trace("Trace 日志...");
        log.debug("Debug 日志...");
        log.info("Info 日志...");
        log.warn("Warn 日志...");
        log.error("Error 日志...");
    }
}

如果我们想采用 LOGGER 变量名,可以增加 lombok.config 文件,
并在文件中增加 lombok.log.fieldName=LOGGER 的配置项即可

参考文档:
https://cloud.tencent.com/developer/article/1914231
https://cloud.tencent.com/developer/article/2354562

  • 45
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是一个开源的Java开发框架,可以用于快速开发独立的、可扩展的、高性能的门户网站应用程序。 Spring Boot的门户源码包括了用于构建门户网站的各种组件、模块和配置文件。它提供了一个基础框架开发者可以利用这些组件和配置进行快速开发,减少了繁琐的配置工作,提高了开发效率。同时,Spring Boot提供了许多开箱即用的特性,如内置的Web容器、自动配置、热部署等,使得开发人员可以更加专注于业务逻辑的实现,而无需关注底层技术细节。 在门户网站开发中,Spring Boot的源码通常包括以下几个方面: 1. 控制器层:包含各种处理请求的Controller类,负责接收用户的请求,并进行相应的业务处理和返回结果。 2. 服务层:包含各种业务逻辑的实现类,负责处理控制器传递过来的请求,并调用相应的数据访问层进行数据操作。 3. 数据访问层:包含与数据库交互的接口和实现类,负责对数据库进行增删改查等操作。 4. 数据库:包括门户网站所需的数据库表结构和数据,用于存储和管理门户网站的相关信息。 5. 配置文件:包括Spring Boot的配置文件,如application.properties或application.yml,用于配置各种参数,如数据库连接信息、服务器端口等。 总之,Spring Boot开发门户源码是一个基于Spring Boot框架的、用于构建门户网站的源代码集合。它充分利用了Spring Boot的优势和特性,提供了一种简化和高效的开发方式,使得开发者能够更加快速、灵活地构建和调试门户网站应用程序。 ### 回答2: Spring Boot 是一个基于 Spring 框架的快速开发框架,它大大简化了项目的配置和部署流程,提供了丰富的开箱即用功能,使开发者能够更专注于业务逻辑的实现。而开发门户源码则是使用 Spring Boot 框架开发门户网站的代码。 开发门户源码通常包含以下几个核心模块: 1. 控制层(Controller):用于接收客户端请求并处理业务逻辑,通过定义不同的请求映射和接口进行功能实现。 2. 服务层(Service):用于实现具体的业务逻辑,包括对数据的处理、算法实现、与其他组件间的交互等。 3. 数据访问层(Dao):用于与数据库进行数据的读取和写入操作,通过相关的持久化框架(如 MyBatis、Hibernate)提供对数据库的访问。 4. 实体类(POJO):用于封装请求参数、响应结果和数据模型等,通过注解和配置与数据库表进行映射。 5. 配置文件:主要是项目的配置文件,包括数据库连接信息、端口配置、日志配置等。 门户源码在实际开发中可以根据需求进行功能扩展和定制,可以引入相关的组件和插件来实现不同的功能要求。此外,还可以根据实际的业务需求进行页面模板的设计和开发,以及安全验证、缓存处理等方面的功能实现。 总的来说,Spring Boot 的门户源码开发可以帮助快速搭建门户网站,并提供了一系列强大的功能和组件,能够帮助开发者以高效的方式构建出稳定、高可用的门户网站。 ### 回答3: Spring Boot是一个开源的Java框架,用于快速开发独立的、可扩展的、生产级别的应用程序。它通过提供一组开箱即用的功能和约定俗成的配置,大大简化了Java应用程序的开发过程。 Spring Boot开发门户的源码会涉及到以下几个方面: 1. 项目结构:Spring Boot的项目结构通常按照传统的MVC(模型-视图-控制器)结构组织。该结构对于大多数应用程序非常合适,包括模型层、服务层、控制层、视图层等。源码可能会包含这些不同层级的代码文件和文件夹。 2. 控制器(Controller):控制器是Spring Boot应用程序的入口点,它由一系列请求处理方法组成。这些方法会接受请求并返回响应。源码中可能会包含不同控制器的实现,每个控制器负责处理不同的请求。 3. 服务(Service):服务层通常包含应用程序的业务逻辑。服务是控制器与数据访问层(持久层)之间的桥梁,通过封装数据访问逻辑并提供可复用的功能,减少控制器的复杂性。源码中可能会包含一些服务的实现。 4. 数据访问(DAO):数据访问层通常负责与数据库进行交互,执行数据的增删改查操作。源码中可能会包含一些数据访问对象(DAO)的实现,用于封装数据库的访问逻辑。 5. 配置文件:Spring Boot的配置通常使用属性文件(如application.properties或application.yml)来进行。源码中可能会包含一些配置属性,用于配置应用程序的行为。 总的来说,Spring Boot开发门户的源码会包含多个文件和文件夹,分别负责不同的功能,如控制器、服务、数据访问等。通过这些源码,可以了解到如何使用Spring Boot开发一个门户应用程序,并学习到Spring Boot的一些最佳实践和设计模式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值