SpringBoot 日志与配置文件

news2025/1/31 21:58:23

SpringBoot 配置文件格式

Properties 格式

@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前缀的所有配置进行绑定
@Data
public class Person {
    private String name;
    private Integer age;
    private Date birthDay;
    private Boolean like;
    private Child child; //嵌套对象
    private List<Dog> dogs; //数组(里面是对象)
    private Map<String,Cat> cats; //表示Map
}

@Data
public class Dog {
    private String name;
    private Integer age;
}

@Data
public class Child {
    private String name;
    private Integer age;
    private Date birthDay;
    private List<String> text; //数组
}

@Data
public class Cat {
    private String name;
    private Integer age;
}
#private String name;
person.name=张三

#private Integer age;
person.age=18

#private Date birthDay;
person.birthDay=2010/10/12 12:12:12

#private Boolean like;
person.like=true

#private Child child; 嵌套对象
person.child.name=李四
person.child.age=12
person.child.birthDay=2018/10/12

#private List<Dog> dogs 数组(里面是对象)
person.child.text[0]=abc
person.child.text[1]=def

person.dogs[0].name=小黑
person.dogs[0].age=3
person.dogs[1].name=小白
person.dogs[1].age=2

#private Map<String,Cat> cats(map) 
person.cats.c1.name=小蓝
person.cats.c1.age=3
person.cats.c2.name=小灰
person.cats.c2.age=2

YAML 格式

@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前缀的所有配置进行绑定
@Data
public class Person {
    private String name;
    private Integer age;
    private Date birthDay;
    private Boolean like;
    private Child child; //嵌套对象
    private List<Dog> dogs; //数组(里面是对象)
    private Map<String,Cat> cats; //表示Map
}

@Data
public class Dog {
    private String name;
    private Integer age;
}

@Data
public class Child {
    private String name;
    private Integer age;
    private Date birthDay;
    private List<String> text; //数组
}

@Data
public class Cat {
    private String name;
    private Integer age;
}
person:
  #private String name;
  name: 张三
  
  #private Integer age;
  age: 18
  
  #private Date birthDay;
  birthDay: 2010/10/10 12:12:12
  
  #private Boolean like;
  like: true
  
  #private Child child 【对象】
  child:
    name: 李四
    age: 20
    birthDay: 2018/10/10
    text: ["abc","def"]
    
  #private List<Dog> dogs; //数组(里面是对象)  
  dogs:
    # 第一个 dog
    - name: 小黑
      age: 3
    # 第二个 dog  
    - name: 小白
      age: 2
  
  #private Map<String,Cat> cats; //表示Map
  cats:
    #Cat 对象第一种表示方式
    c1:
      name: 小蓝
      age: 3
    #Cat 对象第二种表示方式  
    c2: {name: 小绿,age: 2} #对象也可用{}表示

SpringBoot 日志配置

日志简介


在这里插入图片描述

规范:项目开发不要编写System.out.println(),应该用日志记录信息

  • SpringBoot 使用 SLF4j 作为内部日志门面,但底层日志实现是开放的。可对接其他日志框架
  • SpringBoot 默认实现是 Logback

日志记录


  • 方式 1:使用 Lombok@Slf4j 直接使用 log.infolog.debug..... 打印
@RestController
@Slf4j
public class HelloController {

    Logger log = LoggerFactory.getLogger(Logger.class);

    @GetMapping("/h")
    public String hello(String a, String b){
		
        //这里 a b 用来接收形参, 自动填充到 {} 中
        log.info("niho a{}, b{}" , a, b);
        return "hello";
    }
}
  • 方式2:使用 Logger log = LoggerFactory.getLogger(Logger.class) 日志工厂
@RestController
public class HelloController {

    Logger log = LoggerFactory.getLogger(Logger.class);

    @GetMapping("/h")
    public String hello(String a, String b){

        log.info("niho a{}, b{}" , a, b);
        return "hello";
    }
}

日志底层


  • 每个 starter 场景,都会导入一个核心场景 spring-boot-starter
  • 核心场景引入了日志的所用功能 spring-boot-starter-logging
  • 默认使用了 logback + slf4j 组合作为默认底层日志
  • xxxAutoConfiguration 是系统启动完了放好组件,后来用的。而日志是利用 LoggingListener 监听器配置的
  • 所有的日志配置可以通过修改配置文件实现。 logging 开头就是日志相关配置

日志格式


默认格式

023-03-31T13:56:17.511+08:00  INFO 4944 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat
  • 时间和日期:毫秒级精度
  • 日志级别:ERROR, WARN, INFO, DEBUG, TRACE
  • 进程 ID
  • ---: 消息分割符
  • 线程名: 使用[]包含
  • Logger 名: 通常是产生日志的类名
  • 消息: 日志记录的内容

修改日志格式

  • 默认日志格式:参照spring-boot包下 additional-spring-configuration-metadata.json
%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}

建议修改成

  • %d{yyyy-MM-dd HH:mm:ss.SSS} 表示日期和时间,精确到毫秒。
  • [%thread] 表示输出当前线程名称。
  • %-5level 表示日志级别,左对齐并占 5 个字符。
  • %logger{36} 表示日志记录器名称,最大长度为 36 个字符。
  • %msg 表示日志消息本身。
  • %n 表示换行符。
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n

Application.properties 修改配置文件

#修改控制台日志输出格式
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

#修改日志记录文件格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n

日志级别


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

注意

  • 不指定级别的所有类,都使用 root 指定的级别作为默认级别
  • SpringBoot 日志默认级别是 INFO

Application.properties 中配置日志记录级别

#默认所有日志没有精确指定级别就使用 root 默认级别
logging.level.root=info

#logging.level.包名
#精确调整某个包下日志级别
logging.level.com.atguigu.logging.controller=info
logging.level.com.atguigu.logging.service=info

日志分组


日志分组技巧

  • 将相关的 logging 分组在一起,统一配置。SpringBoot 也支持。比如:Tomcat 相关的日志统一设置
#logging.group.组名 = 包1,包2
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat

#配置这个组的级别
logging.level.tomcat=trace

SpringBoot 预定义的两个组

NameLoggers
weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

日志文件归档与滚动切割


归档:每天的日志单独存到一个文档中。

切割:比如每个文件10MB,超过大小切割成另外一个文件。

  • 每天的日志应该独立分割出来存档。如果使用 logback(SpringBoot 默认整合),可以通过 application.properties/yaml 文件指定日志滚动规则。
  • 如果是其他日志系统,需要自行配置(添加 log4j2.xmllog4j2-spring.xml… )

归档切割规则设置

配置项描述
logging.logback.rollingpolicy.file-name-pattern日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)
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).

自定义日志配置

通常我们配置 application.properties 就够了。当然也可以自定义。自定义后我们就可以用自己的配置。会覆盖掉默认的配置

  • 建议在日志配置中使用-spring 变量(例如,logback-spring.xml 而不是 logback.xml)。否则 spring 可能无法完全控制日志初始化
日志系统自定义
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging)logging.properties

切换日志组合

  • 排除掉原本的 logging 引入新的日志实现
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
  • 配置 xml 日志配置文件
    • log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
  • 使用对应日志 Logger 实现类
@RestController
public class HelloController {

    private static final Logger log = LoggerFactory.getLogger(org.apache.logging.log4j.core.Logger.class);

    @GetMapping("/h")
    public String hello(String a, String b){

        log.info("niho a{}, b{}" , a, b);
        return "hello";
    }
}

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

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

相关文章

Qt中Widget及其子类的相对位置移动

Qt中Widget及其子类的相对位置移动 最后更新日期&#xff1a;2025.01.25 下面让我们开始今天的主题… 一、开启篇 提出问题&#xff1a;请看上图&#xff0c;我们想要实现的效果是控件黄色的Widge&#xff08;m_infobarWidget&#xff09;t随着可视化窗口&#xff08;m_glWidge…

【Node.js】Koa2 整合接口文档

部分学习来源&#xff1a;https://blog.csdn.net/qq_38734862/article/details/107715579 依赖 // koa2-swagger-ui UI视图组件 swagger-jsdoc 识别写的 /***/ 转 json npm install koa2-swagger-ui swagger-jsdoc --save配置 config\swaggerConfig.js const Router requir…

Docker/K8S

文章目录 项目地址一、Docker1.1 创建一个Node服务image1.2 volume1.3 网络1.4 docker compose 二、K8S2.1 集群组成2.2 Pod1. 如何使用Pod(1) 运行一个pod(2) 运行多个pod 2.3 pod的生命周期2.4 pod中的容器1. 容器的生命周期2. 生命周期的回调3. 容器重启策略4. 自定义容器启…

leetcode——排序链表(java)

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&#xff1a; …

基于springboot的校园部门资料管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

数据结构初阶之堆的介绍与堆的实现

一、堆的概念与结构 如果有一个关键码的集合&#xff0c;把它的所有元素按完全二叉树的顺序存储在一个一维数组中&#xff0c;并满足&#xff1a;&#xff0c;则称为小堆&#xff08;或大堆&#xff09;。 将根结点最大的堆叫做最大堆或大根堆&#xff0c;根结点最小的堆叫做…

Day29(补)-【AI思考】-精准突围策略——从“时间贫困“到“效率自由“的逆袭方案

文章目录 精准突围策略——从"时间贫困"到"效率自由"的逆袭方案**第一步&#xff1a;目标熵减工程&#xff08;建立四维坐标&#xff09;** 与其他学习方法的结合**第二步&#xff1a;清华方法本土化移植** 与其他工具对比**~~第三步&#xff1a;游戏化改造…

docker中运行的MySQL怎么修改密码

1&#xff0c;进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2&#xff0c;登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…

leetcode——二叉树的中序遍历(java)

给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出…

信息安全专业优秀毕业设计选题汇总:热点选题

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

Java---猜数字游戏

本篇文章所实现的是Java经典的猜数字游戏 , 运用简单代码来实现基本功能 目录 一.题目要求 二.游戏准备 三.代码实现 一.题目要求 随机生成一个1-100之间的整数(可以自己设置区间&#xff09;&#xff0c;提示用户猜测&#xff0c;猜大提示"猜大了"&#xff0c;…

SAP系统中的主要采购类型/采购模式总结

在 SAP 系统中,采购类型主要有以下几种: 一、标准采购订单(Standard Purchase Order) 描述:这是最常用的采购类型,用于一次性采购货物或服务。采购部门根据需求部门提出的采购申请,向供应商发出采购订单,明确规定了采购的物料、数量、价格、交货日期等详细信息。 应…

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(五)

Understanding Diffusion Models: A Unified Perspective&#xff08;五&#xff09; 文章概括基于得分的生成模型&#xff08;Score-based Generative Models&#xff09; 文章概括 引用&#xff1a; article{luo2022understanding,title{Understanding diffusion models: A…

ThinkPHP 8模型与数据的插入、更新、删除

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

项目升级Sass版本或升级Element Plus版本遇到的问题

项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件&#xff0c;则需要升级相对应的sass版本&#xff0c;Element 文档中有提示&#xff0c;2.8.5及以后得版本&#xff0c;sass最低支持的版本为1.79.0&#xff0c;所升级sass、…

基于OSAL的嵌入式裸机事件驱动框架——整体架构调度机制

参考B站up主【架构分析】嵌入式祼机事件驱动框架 感谢大佬分享 任务ID &#xff1a; TASK_XXX TASK_XXX 在系统中每个任务的ID是唯一的&#xff0c;范围是 0 to 0xFFFE&#xff0c;0xFFFF保留为SYS_TSK_INIT。 同时任务ID的大小也充当任务调度的优先级&#xff0c;ID越大&#…

Three.js 后期处理(Post-Processing)详解

目录 前言 一、什么是后期处理&#xff1f; 二、Three.js 后期处理的工作流程 2.1 创建 EffectComposer 2.2 添加渲染通道&#xff08;Render Pass&#xff09; 2.3 应用最终渲染 三、后期处理实现示例 3.1 基础代码 四、常见的后期处理效果 4.1 辉光效果&#xf…

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号&#xff1a; 2、小于号 和 大于号&#xff1a; 3、引号&#xff1a; 二、版权、注册商标符号的使用 1、版权符号&#xff1a;© 2、注册商标符号&#xff1a; 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…

JAVA实战开源项目:在线文档管理系统(Vue+SpringBoot) 附源码

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

快速分析LabVIEW主要特征进行判断

在LabVIEW中&#xff0c;快速分析程序特征进行判断是提升开发效率和减少调试时间的重要技巧。本文将介绍如何高效地识别和分析程序的关键特征&#xff0c;从而帮助开发者在编写和优化程序时做出及时的判断&#xff0c;避免不必要的错误。 ​ 数据流和并行性分析 LabVIEW的图形…