SpringBoot 日志与配置文件

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]=defperson.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: 20birthDay: 2018/10/10text: ["abc","def"]#private List<Dog> dogs; //数组(里面是对象)  dogs:# 第一个 dog- name: 小黑age: 3# 第二个 dog  - name: 小白age: 2#private Map<String,Cat> cats; //表示Mapcats:#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.mzph.cn/news/894145.shtml

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

相关文章

【Elasticsearch】 Intervals Query

Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则&#xff0c;这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法 翻遍了CSDN&#xff0c;试了所有办法都没办法&#xff0c;最后偶然间竟然解决了 解决方法其实很简单&#xff1a;本地模拟器下载路径下面不能有中文。。。。。 切换正确路径以后&#xff0c;成功运行&#xff0c;哦…

删除数组中的重复项(leetcode刷题)

题目描述&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的…

网站快速收录:优化图片与视频的SEO策略

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/29.html 优化图片与视频的SEO策略对于网站快速收录至关重要。以下是一些具体的策略&#xff0c;旨在提高图片与视频在搜索引擎中的可见性和收录率&#xff1a; 一、图片SEO优化策略 选择合…

虚幻基础16:locomotion direction

locomotion locomotion&#xff1a;角色运动系统的总称&#xff1a;包含移动、奔跑、跳跃、转向等。 locomotion direction 玩家输入 玩家输入&#xff1a;通常代表玩家想要的移动方向。 direction 可以计算当前朝向与移动方向的Δ。从而实现朝向与移动(玩家输入)方向的分…

单片机基础模块学习——超声波传感器

一、超声波原理 左边发射超声波信号&#xff0c;右边接收超声波信号 左边的芯片用来处理超声波发射信号&#xff0c;中间的芯片用来处理接收的超声波信号 二、超声波原理图 T——transmit 发送R——Recieve 接收 U18芯片对输入的N_A1信号进行放大&#xff0c;然后输入给超声…

基于 NodeJs 一个后端接口的创建过程及其规范 -- 【elpis全栈项目】

基于 NodeJs 一个后端接口的创建过程及其规范 一个接口的诞生&#xff1a; #mermaid-svg-46HXZKI3fdnO0rKV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46HXZKI3fdnO0rKV .error-icon{fill:#552222;}#mermaid-sv…

MySQL(高级特性篇) 14 章——MySQL事务日志

事务有4种特性&#xff1a;原子性、一致性、隔离性和持久性 事务的隔离性由锁机制实现事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证&#xff08;1&#xff09;REDO LOG称为重做日志&#xff0c;用来保证事务的持久性&#xff08;2&#xff09;UNDO LOG称为回…

【设计模式-行为型】备忘录模式

一、什么是备忘录模式 来到备忘录模式了&#xff0c;这个模式我感觉相对简单一些&#xff0c;就是备份&#xff0c;或者快照。跟前面一样为了加深理解&#xff0c;我们引入一个电影情结来说明啥是备忘录模式&#xff0c;以来加深大家对备忘录模式的认识。那么&#xff0c;在电影…

C# 与.NET 日志变革:JSON 让程序“开口说清话”

一、引言&#xff1a;日志新时代的开启 在软件开发的漫长旅程中&#xff0c;日志一直是我们不可或缺的伙伴。它就像是应用程序的 “黑匣子”&#xff0c;默默地记录着程序运行过程中的点点滴滴&#xff0c;为我们在调试、排查问题以及性能优化时提供关键线索。在早期&#xff…

AI在自动化测试中的伦理挑战

在软件测试领域&#xff0c;人工智能&#xff08;AI&#xff09;已经不再是遥不可及的未来技术&#xff0c;而是正在深刻影响着测试过程的现实力量。尤其是在自动化测试领域&#xff0c;AI通过加速测试脚本生成、自动化缺陷检测、测试数据生成等功能&#xff0c;极大提升了测试…

实验一---典型环节及其阶跃响应---自动控制原理实验课

一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…

C++小病毒-1.0勒索(更新次数:2)

内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 在C20环境下,并在虚拟机里运行此代码!&#xff0c;病毒带来后果自负! 使用时请删除在main()里的注释,并修改位置至C:\\(看我代码注释)//可以改成WIN Main() #include <iostream> #i…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化

1.25 视觉风暴&#xff1a;NumPy驱动数据可视化 目录 #mermaid-svg-i3nKPm64ZuQ9UcNI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i3nKPm64ZuQ9UcNI .error-icon{fill:#552222;}#mermaid-svg-i3nKPm64ZuQ9UcNI …

小南每日 AI 资讯 | AI模型扩展的快速增长时代正在放缓 | 25/01/30

AI模型扩展的挑战&#xff1a;随着研究人员发现单纯通过增加规模和计算能力难以获得更大回报&#xff0c;AI模型扩展的快速增长时代正在放缓。 GPT-5开发延迟&#xff1a;OpenAI雄心勃勃的GPT-5项目&#xff08;代号&#xff1a;Orion&#xff09;面临着显著的障碍&#xff0c…

指针(C语言)从0到1掌握指针,为后续学习c++打下基础

目录 一&#xff0c;指针 二&#xff0c;内存地址和指针 1&#xff0c;什么是内存地址 2&#xff0c;指针在不同系统下所占内存 三&#xff0c;指针的声明和初始化以及类型 1,指针的声明 2,指针 的初始化 1&#xff0c; 初始化方式优点及适用场景 4,指针的声明初始化类型…

备赛蓝桥杯之第十五届职业院校组省赛第三题:产品360度展示

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…

如何构建树状的思维棱镜认知框架

在思维与知识管理中&#xff0c;“树状思维棱镜”通常指一种层级式、可多维度展开和不断深入&#xff08;下钻&#xff09;的认知框架。它不仅仅是普通的树状结构&#xff08;如传统思维导图&#xff09;&#xff0c;更强调“棱镜”所体现的多视角、多维度切换与综合分析的能力…

【MQ】如何保证消息队列的高性能?

零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件&#xff0c;基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO&#xff0…

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(动态菜单组件实现)

目录 面对对象C的程序设计&#xff08;范例&#xff09; 面对对象C的程序设计&#xff08;应用&#xff09; 进一步谈论我上面给出的代码——继承 实现一个面对对象的文本编辑器 所以&#xff0c;什么是继承 重申我们对菜单的抽象 抽象菜单项目 抽象菜单动画 实现菜单功…