SpringBoot的日志系统(日志分组、文件输出、滚动归档)

@[toc](目录)

> SpringBoot3需要jdk17

# 1. 简介

1. Spring5及以后Spring自己实现了commons-logging,来作为内部的日志。日志的jar包是org.springframework:spring-jcl:6.0.10。查看org.apache.commons.logging.LogAdapter
```Java
package org.apache.commons.logging;
......省略部分......
final class LogAdapter {
    private static final boolean log4jSpiPresent = isPresent("org.apache.logging.log4j.spi.ExtendedLogger");
    private static final boolean log4jSlf4jProviderPresent = isPresent("org.apache.logging.slf4j.SLF4JProvider");
    private static final boolean slf4jSpiPresent = isPresent("org.slf4j.spi.LocationAwareLogger");
    private static final boolean slf4jApiPresent = isPresent("org.slf4j.Logger");
    private static final Function<String, Log> createLog;
......省略部分......
```
只要导入了哪些日志包,就会使用哪些日志实现框架。所以底层的日志是开放的,可对接其他日志框架

2. 支持 jul、log4j2、logback(默认)日志实现。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件


# 2. SpringBoot日志默认配置流程
1、每个starter场景,都会导入一个核心场景spring-boot-starter
2、核心场景引入了日志的所用功能spring-boot-starter-logging
3、spring-boot-starter-logging默认使用了logback + slf4j 组合作为默认底层日志
4、日志是系统一启动就要用,xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的
5、查看autoconfiguration的logging目录,可以看到日志是利用监听器机制配置好的
6、日志所有的配置都可以通过修改配置文件实现。是以logging开始的所有配置


# 3. 默认日志格式
```
......省略部分......
2023-07-13T05:06:01.866+08:00  INFO 3096 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-07-13T05:06:01.881+08:00  INFO 3096 --- [           main] c.h.s.SpringBoot3TestApplication         : Started SpringBoot3TestApplication in 3.383 seconds (process running for 4.406)
```
默认输出格式:
- 时间和日期:毫秒级精度
- 日志级别:ERROR、WARN、INFO、DEBUG
- 进程ID
- ---: 消息分割符
- 线程名: 使用[]包含
- Logger名: 通常是产生日志的类名
- 消息:日志记录的内容

默认值:参照:org.springframework.boot:spring-boot:3.1.1的META-INF的additional-spring-configuration-metadata.json文件
```
    {
      "name": "logging.pattern.console",
      "type": "java.lang.String",
      "description": "Appender pattern for output to the console. Supported only with the default Logback setup.",
      "sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener",
      "defaultValue": "%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){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}"
    }
```

修改默认值如下:
```
# 显示示例: 2023-07-13 05:16:09.952 INFO  [main] c.h.s.SpringBoot3TestApplication ===> Started SpringBoot3TestApplication in 2.305 seconds (process running for 3.107)
# logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n

# 只修改控制台输出的日期格式
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS
```


# 4. 在类中记录日志
```Java
package com.hh.springboot3test.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class ControllerTest {
    // Logger log = LoggerFactory.getLogger(getClass());

    @GetMapping("/hello")
    public String hello() {

        // 2023-07-13 05:24:15.659  INFO 10212 --- [nio-8080-exec-2] c.h.s.controller.ControllerTest          : 进入hello方法了
        log.info("进入hello方法了");
        return "hello";
    }
}

```


# 5. 日志级别


由低到高:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
- ALL:打印所有日志
- TRACE:追踪框架详细流程日志,一般不使用
- DEBUG:开发调试细节日志
- INFO:关键、感兴趣信息日志
- WARN:警告但不是错误的信息日志,比如:版本过时
- ERROR:业务错误日志,比如出现各种异常
- FATAL:致命错误日志,比如jvm系统崩溃
- OFF:关闭所有日志记录

定义在org.springframework.boot:spring-boot:3.1.1的org.springframework.boot.logging.LogLevel枚举类

application.properties文件配置日志级别
```
# 默认日志级别设置
# logging.level.root=info
# 设置一个包或类的日志级别
logging.level.com.hh.springboot3test.controller.ControllerTest=debug
```


# 6. 日志分组
将相关的logger分组在一起,统一配置。application.properties配置如下:

```
# 多个值用逗号分隔
logging.group.my-logging-group=com.hh.springboot3test.controller.ControllerTest
logging.level.my-logging-group=warn
```

SpringBoot预定义两个组
- web: 包含org.springframework.core.codec、org.springframework.http、org.springframework.web、org.springframework.boot.actuate.endpoint.web、org.springframework.boot.web.servlet.ServletContextInitializerBeans
- sql: 包含org.springframework.jdbc.core、org.hibernate.SQL、org.jooq.tools.LoggerListener


# 7. 文件输出
SpringBoot默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name或logging.file.path配置项


logging.file.name | logging.file.path | 示例 | 效果
------ | ------ | ------ | ------
未指定 | 未指定 |  | 仅控制台输出
指定 | 未指定 | D:\\my.log | 写入指定文件。可以加路径,默认路径是项目根路径
未指定 | 指定 | D:\\ | 写入指定目录,文件名为spring.log
指定 | 指定 |  | logging.file.path无效,以logging.file.name为准

# 8. 文件归档与滚动切割

> 生产环境可以配置按日志级别分类,进行文件归档和滚动切割

归档:每天的日志单独存到一个文档中
切割:每个文件10MB,超过大小切割成另外一个文件


1. 每天的日志应该独立分割出来存档。如果使用logback(SpringBoot默认整合),可以通过application.properties/yaml文件指定日志滚动规则
2. 如果是其他日志系统,需要自己在日志配置文件中进行配置(添加log4j2.xml或log4j2-spring.xml)
3. 默认支持的滚动规则设置如下:

配置项 | 描述
------ | ------
logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)。需要开启日志文件输出。`LOG_FILE`就是日志输出的路径和名称
logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档(默认值:false)
logging.logback.rollingpolicy.max-file-size | 存档前,每个日志文件的最大大小(默认值:10MB)
logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前,可以容纳的最大大小(默认值:0B,即容纳无限大小)。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件
logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数(默认值:7)

# 9. 自定义配置

日志系统 | 自定义
------ | ------
Logback| logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy
Log4j2 | log4j2-spring.xml、log4j2.xml
JDK (Java Util Logging) | logging.properties

建议在日志配置文件中使用-spring变量(例如使用logback-spring.xml而不是logback.xml)。如果您使用标准配置文件,日志初始化时的日志spring不能获取

比如可以使用logback-spring.xml文件进行配置。会和SpringBoot的logback配置混合起作用


# 10. 切换使用log4j2

直接在pom.xml添加依赖就可以了。但是不能使用文件归档与滚动切割,需要在log4j2.xml中自己配置
```
        <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>

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

也可以使用log4j2-spring.xml文件进行配置。会和SpringBoot的log4j2配置混合起作用


# 11 实践

1. 导入任何第三方框架,先排除它的日志包,因为SpringBoot底层控制好了日志
2. 修改application.properties配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在资源路径下就行,比如logback-spring.xml,log4j2-spring.xml
3. 如需对接专业日志系统,如把logback记录的日志灌倒kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何把Elasticsearch中的数据导出为CSV格式的文件

前言| 本文结合用户实际需求用按照数据量从小到大的提供三种方式从ES中将数据导出成CSV形式。本文将重点介Kibana/Elasticsearch高效导出的插件、工具集&#xff0c;通过本文你可以了解如下信息&#xff1a; 1&#xff0c;从kibana导出数据到csv文件 2&#xff0c;logstash导…

VMware vCenter Server 6.7安装过程记录

0、前言 最近由于一些原因需要安装测试VMware ESXi&#xff0c;无奈所有服务器都是十几年前的&#xff0c;配置低也不支持。后来通过VMware兼容性列表查询&#xff0c;快要放弃的时候发现唯一一台Dell R420&#xff0c;如获至宝。通过查询得知最高支持到6.5 U3&#xff0c;好在…

十三水中各种牌型判断LUA版

近期回归程序行业&#xff0c;由于业务需求需要做十三水游戏&#xff0c;什么是十三水就不在多讲&#xff0c;下面是判断十三水牌型的方法&#xff08;带大小王&#xff09; GetSSSPaiType {}; local this GetSSSPaiType; local huaseTable {}; local numTable {}; functi…

在亚马逊购买产品时怎么选择自动收货方式

在亚马逊购买产品时&#xff0c;通常可以在下单时选择不同的收货方式&#xff0c;包括自动收货方式。以下是一般的购买流程&#xff1a; 登录亚马逊账号&#xff1a;打开网站&#xff0c;登录账号&#xff0c;如果没有账号&#xff0c;可以先创建一个。 浏览和添加商品&#…

SpringBoot原理篇

SpringBoot原理篇 ​ 其实从本人的角度出发&#xff0c;看了这么多学习java的小伙伴的学习过程&#xff0c;个人观点&#xff0c;不建议小伙伴过早的去研究技术的原理。原因有二&#xff1a;一&#xff0c;先应用熟练&#xff0c;培养技术应用的条件反射&#xff0c;然后再学原…

v4l2-ioctl.c的一些学习和整理

可以发现&#xff0c;这个宏用的很好&#xff0c;简洁易扩展&#xff0c;自己写代码可以学习下 #define IOCTL_INFO(_ioctl, _func, _debug, _flags) \[_IOC_NR(_ioctl)] { \.ioctl _ioctl, \.flags _flags, \.name #_ioctl, \.func _func, \.debug _…

element table中嵌套el-select 无法选择问题

<el-table-column align"left" label"姓名" show-overflow-tooltip :key"tableKey"><template slot-scope"scope"><el-select placeholder"请选择" :disabled"!saveButton" v-model"scope.ro…

多用户多回路宿舍用电管理解决方案-安科瑞黄安南

01 引言 近几年来&#xff0c;因违规使用大功率恶性负载电器导致宿舍失火的安全事故在各大高校时有发生&#xff0c;给学生和学校都带来了巨大的损失。北京大学、哈尔滨工业大学、上海商学院以及俄罗斯人民友谊大学等高校学生公寓发生的火灾给高校学生公寓的安全用电敲响…

element-ui 图片压缩上传

export const compressImgNew (file) > {return new Promise(resolve > {const reader new FileReader()const image new Image()image.onload (imageEvent) > {const canvas document.createElement(canvas) // 创建画布const context canvas.getContext(2d) …

车载网关通信能力解析——SV900-5G车载网关推荐

随着车联网的发展,各类车载设备对车载网关的需求日益增长。车载网关作为车与车、车与路、车与云之间连接的关键设备,其通信能力直接影响整个系统的性能。本文将详细解析车载网关的通信能力,并推荐性价比高的SV900-5G车载网关。 链接直达&#xff1a;https://www.key-iot.com/i…

初探亚马逊 AI 编程助手 CodeWhisperer

前言 4月18日&#xff0c;亚马逊云科技宣布&#xff0c;实时 AI 编程助手 Amazon CodeWhisperer 正式可用,同时推出的还有供所有开发人员免费使用的个人版&#xff08;CodeWhisperer Individual&#xff09;。Amazon CodeWhisperer 是一个通用的、由机器学习驱动的代码生成器&…

Jenkins CLI二次开发工具类

使用Jenkins CLI进行二次开发 使用背景 公司自研CI/DI平台&#xff0c;借助JenkinsSonarQube进行代码质量管理。对接版本 Jenkins版本为&#xff1a;Version 2.428 SonarQube版本为&#xff1a;Community EditionVersion 10.2.1 (build 78527)技术选型 Java对接Jenkins有第…

arco-disign vue + vue3 封装一个“下拉多组单选组件”

手搓一个下拉框多组单选组件, 实现采用框架 arco-disign vue + vue3 组件采用:a-popover、a-input-tag、a-radio-group、a-radio 实现效果: 调用组件 <SelectGroupRadiov-model="searchModel.indicatorScreening":options="dict.indicatorScreening&qu…

USB协议学习(二)设备枚举过程分析

USB协议学习&#xff08;二&#xff09;设备枚举过程分析 笔者来聊聊设备枚举过程分析. 这里写自定义目录标题 USB协议学习&#xff08;二&#xff09;设备枚举过程分析USB设备运行过程USB设备枚举USB设备通信构成USB设备请求USB枚举过程分析如何改变文本的样式插入链接与图片如…

软硬件架构分层总结

一、前言 软件系统很多架构图我们经常看到是这样的三段 就是这三段就可以演化出很多层 二、硬件架构分层 硬件层&#xff0c;基本是计算机硬件的体系结构&#xff0c;包括硬盘设备&#xff0c;cpu&#xff0c;内存&#xff0c;控制器&#xff0c;运算器&#xff0c;寄存器&am…

Stream流式处理

Stream流式处理&#xff1a; 建立在Lambda表达式基础上的多数据处理技术。 可以对集合进行迭代、去重、筛选、排序、聚合等处理&#xff0c;极大的简化了代码量。 Stream常用方法 Stream流对象的五种创建方式 //基于数组 String[] arr {"a","b","c…

吉利高端品牌领克汽车携手体验家,重塑智能创新的汽车服务体验

浙江吉利控股集团&#xff08;以下简称“吉利集团”&#xff09;始建于1986年&#xff0c;1997年进入汽车行业&#xff0c;一直专注实业&#xff0c;专注技术创新和人才培养&#xff0c;坚定不移地推动企业转型升级和可持续发展。现资产总值超5100亿元&#xff0c;员工总数超过…

k8s集群镜像下载加gradana监控加elk日志收集加devops加秒杀项目

展示 1.配套资料2.devops 3.elk日志收集 4.grafana监控 5.dashboard![在这里插入图片描述](https://img-blog.csdnimg.cn/bf294f9fd98e4c038858a6bf5c34dbdc.png 目的 学习k8s来来回回折腾很久了&#xff0c;光搭个环境就能折腾几天。这次工作需要终于静下心来好好学习了一…

ES6中的Set集合与Map映射

文章目录 一、Set集合1.Set的基本使用2.Set的常见方法3.WeakSet使用4.WeakSet的应用 二、Map映射1.Map的基本使用2.Map的常见方法3.WeakMap使用4.WeakMap的应用 三、ES6的其它知识点说明 一、Set集合 1.Set的基本使用 在ES6之前&#xff0c;我们存储数据的结构主要有两种&…

v-for列表渲染

一、v-for迭代数组 <li v-for"(e,index) in emp" :key"e.id">编号{{index1}} 名字{{e.name}} 年龄{{e.age}} </li> e 是循环数组中的每个元素的别名index 是当前循环的下表&#xff0c;从0开始:key 的作用&#xff1a; 是为了给 Vue 一个提示…