当前位置: 首页 > news >正文

Spring Boot配置文件与日志文件

1. Spring Boot 配置文件

我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中.

1. 配置文件作用

整个项目中所有重要的数据都是在配置文件中配置的,比如:

  • 数据库的连接信息 (包含用户名和密码的设置) ;
  • 项目的启动端口;
  • 第三方系统的调用秘钥等信息;
  • 用于发现和定位问题的普通日志和异常日志等

想象一下如果没有配置信息,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志,所以配置文件的作用是非常重要的。

2. 配置文件的格式

Spring Boot 配置文件主要分为以下两种格式:

  • .properties
  • .yml

特殊说明:

  1. 两个配置文件从功能上来讲是可以同时存在的,但是企业中通常会规定使用某一种格式的配置文件。
  2. 如果同一个配置出现在两种格式的配置文件中的话,那么以 properties 为主。
如果配置文件中出现了同样的配置,比如 properties 和 yml 中都配置了"server.port", 那么这个时候会以 properties 中的配置为主,也就是 properties 配置文件的优先级最高,但加载完.properties 文件之后,也会加载 .yml 文件的配置信息

3. properties配置文件说明

properties 配置文件是最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件.

3.1 properties基本语法

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:

# 配置项目端口号
server.port=8084
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
注: 配置文件中使用“#”来添加注释信息

配置项分类:

  1. 系统配置项,比如 server.port/spring.datasource.url... -> 系统
  2. 用户自定义配置 (非系统配置项) -> key 用户自定义
IDEA默认这个配置文件不支持中文, 也就是说如果写了中文的注释, 下次启动就变成乱码了. 针对这种情况, 可以在IDEA中Settings搜索file encoding进行设置.(注意"新建项目"也同时要设置)

3.2 读取配置文件

如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现.

@Value 注解使用“${}”的格式读取,如下代码所示:

package com.example.demo.component;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadYml {@Value("${server.port}")private String port;@PostConstructpublic void postConstruct() {System.out.println("Read YML, port: " + port);}
}

最终执行效果:

@Component 在Spring Boot 启动时候会注入到框架中,注入到框架中时会执行 @PostConstruct初始化方法,这个时候就能读取到配置信息了。

3.3 properties优缺点分析

优点:

  1. 系统默认的配置文件;
  2. properties 配置项的优先级比 yml 高
  3. 格式简单、不容易出错。

缺点:

写法比较冗余。

4. yml配置文件说明

yml是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中文就是“另一种标记语”

yml优点分析

  • yml 是一个可读性高,写法简单、易于理解,它的语法和 JSON 语言类似。
  • yml 支持更多的数据类型,它可以简单表达清单 (数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等
  • yml 支持更多的编程语言,它不止是 Java 中可以使用在 Golang、PHP、Python、Ruby、JavaScript、Perl 中。

4.1 yml基本语法

yml 是树形结构的配置文件,它的基础语法是“key: value”,注意 key 和 value 之间使用英文冒汗加空格的方式组成的,其中的空格不可省略。

yml示例如下:

server:port: 9999

使用yml连接数据库

yml使用示例:

spring:datasource:url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8username: rootpassword: root

4.2 yml使用进阶

4.2.1 yml配置不同数据类型及null

# 字符串
string.value: Hello# 布尔值,true或false
boolean.value: true
boolean.value1: false# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法# Null,~代表null
null.value: ~
4.2.1.1 yml配置读取

yml 读取配置的方式和 properties 相同, 使用@Value注解即可, 实现代码如下:

package com.example.demo.component;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadYml {@Value("${string:hello}")private String hello;@PostConstructpublic void postConstruct() {System.out.println("Read YML, hello: " + hello);}
}

4.2.1.2 注意事项: value值加单双引号

字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。

尝试在 application.yml 中配置如下信息:

string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."
package com.example.demo.component;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadYml3 {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;@PostConstructpublic void postConstruct() {System.out.println("string.str1: " + str1);System.out.println("string.str1: " + str2);System.out.println("string.str1: " + str3);}
}

从上述结果可以看出:

  • 字符串默认不用加上单引号或者双引号
  • 单引号会转义特殊字符,特殊字符最终只是一个普通的字符串数据。
  • 双引号不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思.

4.2.2 配置对象

student:id: 1name: 张三age: 18
package com.example.demo.entity;@ConfigurationProperties("student")
@Component
@Setter
@Getter
@ToString
public class StudentComponent {private int id;private String name;private int age;
}
注意:以上代码中的 getter 和 setter 方法不能省略.(本文使用lombok, 所以省略)
package com.example.demo.component;import com.example.demo.entity.StudentComponent;@Component
public class ReadYml4 {@Autowiredprivate StudentComponent studentComponent;@PostConstructpublic void postConstruct() {System.out.println(studentComponent);}
}

 

查看更多的系统配置项

想要查看 Spring Boot 更多系统配置项,访问官网: Common Application Properties

5. properties VS yml

  • properties 是以 key=value 的形式配置的键值类型的配置文件,而 yml 使用的是类似json 格式的树形配置方式进行配置的,yml层级之间使用换行缩进的方式配置,key 和 value 之间使用“:”英文冒号加空格的方式设置,并且空格不可省略
  • properties 为早期并且默认的配置文件格式,但其配置存在一定的几余数据,使用 yml可以很好的解决数据几余的问题。
  • yml 通用性更好,支持更多语言,如 Java、Go、Python 等,如果是云服务器开发,可以使用一份配置文件作为 Java 和Go的共同配置文件
  • yml支持更多的数据类型

2. Spring Boot日志文件

1. 日志的作用

  • 记录错误日志和警告日志(发现和定位问题)
  • 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户
  • 记录系统的操作日志,方便数据恢复和定位操作人。
  • 记录程序的执行时间,方便为以后优化程序提供数据支持。

2. 日志的使用

Spring Boot 内置了日志框架, 在启动的时候默认就有日志输出,如下图所示:

2.1 Spring Boot内置日志框架

下图是常用的一个日志框架, 其中SLF4J和logback是Spring Boot所内置的日志框架.

SLF4J是门面模式, 它类似于代理模式, 是设计模式的一种, 就是来了用户之后, 它不是直接具体去操作某一个日志框架, 而是由某一个代理(门面)先行处理.

也就是用户在写日志时, 首先请求会先来到门面模式SLF4J, 然后SLF4J再根据我们系统的配置决定我们要调用的具体的框架是什么.

类似于生活中买房子先通过中介(SLF4J), 中介能够根据我们的诉求来匹配最合适的房源.

2.2 自定义日志打印

Spring Boot自定义日志打印的步骤:

  1. 得到日志对象
  2. 使用日志对象提供的方法打印日志.

2.2.1 得到日志对象

在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:

// 1. 得到日志对象
private static final Logger logger = LoggerFactory.getLogger(TestController.class);

注意: Logger 对象是属于 org.slf4j 包下的,不要导入错包.

2.2.2 使用日志对象打印日志

日志对象的打印方法有很多种,我们可以先使用 info()方法来输出日志,如下代码所示:

logger.info("--------------打印日志------------");

2.2.3 日志格式说明

3. 日志级别

3.1 日志级别的作用

  • 日志级别可以帮你筛选出重要的信息,比如设置日志级别为 error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者信息筛选的时间。
  • 日志级别可以控制不同环境下,一个程序是否需要打印日志,如开发环境我们需要很详细的信息而生产环境为了保证性能和安全性就会输入尽量少的日志,而通过日志的级别就可以实现此需求.

3.2 日志级别的分类与使用

日志的级别分为:

  • trace: 微量,少许的意思,级别最低;
  • debug: 需要调试时候的关键信息打印
  • info: 普通的打印信息(默认日志级别)
  • warn: 警告,不影响使用,但需要注意的问题;
  • error: 错误信息,级别较高的错误日志信息;
  • fatal:致命的,因为代码异常导致程序退出执行的事件

日志级别的顺序:

越往上接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的日志了

日志级别的设置

在配置文件中设置:

logging:level:root: errorcom:example:demo:controller: trace

默认日志输出级别

清除掉配置文件中的日志设置,观察控制台输入的日志级别得到以下结论,日志的输出级别,默认是 info.

4. 日志持久化

以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。

想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后Spring Boot 就会将控制台的日志写到相应的目录或文件下了。

注: 日志文件一旦产生,那么日志文件及其内容就会永久的保存,不会出现文件或内容的丢失,无论任何操作都会保持其以上特性。

配置日志文件的保存路径:

logging:file:path: D:\LearningSoftware 

配置日志文件的文件名:

logging:file:name: D:\\springboot.log
根据业务场景来订, 生产级别日志分类:
1.程序运行日志(存放在文件中)
2.业务日志(存放到数据库)

6. 更简单的日志输出 - lombok

每次都使用 LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加一遍,也很麻烦,这里讲一种更好用的日志输出方式,使用 lombok 来更简单的输出

1.添加 lombok 框架支持

2.使用 @slf4j注解输出日志。

6.1 添加 lombok 依赖

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
Spring Boot是默认添加的

6.2 输出日志

package com.example.demo.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class LogController {@RequestMapping("/log/sayhi")public String sayhi(){log.info("log的info");return "log say hi";}
}

注意:使用 @SIf4j 注解,在程序中使用 log 对象即可输入志,并且只能使用 log 对象才能输出, 这是lombok 提供的对象名。

6.3 lombok更多注解说明

基本注解

注解

作用

@Getter

自动添加getter 方法

@Setter

自动添加setter方法

@ToString

自动添加 toString 方法

@EqualsAndHashCode

自动添加 equals 和hashCode 方法

@NoArgsConstructor

自动添加无参构造方法

@AllArgsConstructor

自动添加全属性构造方法,顺序按照属性的定义顺序

@NonNull

属性不能为null

@RequiredArgsConstructor

自动添加必需属性的构造方法,final + @NonNull 的属性为必需

组合注解

注解

作用

@Data

@Getter + @Setter + @ToString +

@EqualsAndHashCode +

@RequiredArgsConstructor +

@NoArgsConstructor

日志注解

注解

作用

@SIf4j

添加一个名为 log的日志,使用 slf4j

6.4 lombok原理

lombok能够打印日志的原理就在于它所应用的是在编译的时候自动添加得到日志对象的代码, 可以在target中看到:

Java程序运行原理:

lombok的作用如下:

相关文章:

Spring Boot配置文件与日志文件

1. Spring Boot 配置文件 我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中. 1. 配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;比如: 数据库的连接信息 (包含用户名和密码的设置) ;项目的启动端口;第三方系统的调…...

可解释性分析的一些类别(草稿)(视觉)

目录 1.交互性解释 2. 本身具有解释性的模型 3.如何将可解释性分析应用到生成模型 参考文献 视觉领域从2020年开始可以分为两块&#xff0c;一个是图像分类&#xff0c;一个是图像生成。 图像分类&#xff1a;输入一张图片&#xff0c;输出语义标签&#xff0c;就是这张图…...

HTTPS-RSA握手

RSA握手过程 HTTPS采用了公钥加密和对称加密结合的方式进行数据加密和解密 RSA握手是HTTPS连接建立过程中的一个关键步骤&#xff0c;用于确保通信双方的身份验证和生成对称加密所需的密钥 通过RSA握手过程&#xff0c;客户端和服务器可以协商出一个共享的对称密钥&#xff0c;…...

bigemap国土管理行业应用

由于国营企业单位&#xff0c;管理土地&#xff0c;必须要有这样的软件套图 客户之前用的谷歌&#xff0c;后来不能访问了&#xff0c;通过其他途径搜索到我们 客户使用软件一般都用于套坐标以及空间规划图&#xff0c;方便于项目选址和居民建房报建在卫星图上找到用地范围&am…...

深入探索 Splashtop Enterprise 的潜力

在当今高度技术化的环境中&#xff0c;远程访问解决方案已成为无数组织的支柱。远程访问解决方案缩短了员工与工作之间的地理差距&#xff0c;提高了工作的效率和灵活性&#xff0c;促进形成了无缝的工作体验。在众多远程访问解决方案中&#xff0c;Splashtop Enterprise 作为远…...

创建型模式-单例模式

文章目录 一、创建型模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现&#xff08;1&#xff09;饿汉式-方式1&#xff08;静态变量方式&#xff09;&#xff08;2&#xff09;饿汉式-方式2&#xff08;静态代码块方式&#xff09;&#xff08;3&#xff09;懒汉式-方…...

2. Linux安装Git

yum安装 查看版本 版本太低&#xff0c;所以我们采用自己上传编译的方式进行 删除已安装的git yum remove git 下载最新安装包&#xff0c;并上传到服务器文件夹下 上传&#xff0c;解压 5.安装编译需要的依赖 yum install curl-devel expat-devel gettext-devel openssl-…...

检查网站是HTTP那种协议与获取域名的ipv6地址

前言 最近在做HTTPS的应用&#xff0c;可能需要使用ipv6的地址做SLB&#xff0c;但是怎么检查配置正确&#xff0c;总不能每次都看日志吧&#xff0c;实际上客户端也很容易查看&#xff0c;总结工作经验。 检查HTTP协议版本 笔者想到了使用浏览器方式&#xff0c;或者抓包&a…...

【转】金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读

原文链接&#xff1a;金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读 《金融数据安全 数据安全分级指南》 解 读 随着IT技术的发展&#xff0c;银行的基础业务、核心流程等众多事务和活动都运营在信息化基础之上&#xff0c;金融机构运行过程中产生了大量的数字…...

FPGA学习——电子时钟模拟(新)

文章目录 一、数码管简介二、C4开发板数码管原理图三、代码实现四、实现效果五、总结 博主在之前曾经编写过一篇电子时钟的博客&#xff08;详情请见此篇博文&#xff09;&#xff0c;但曾经编写的电子时钟&#xff0c;未显示小数点位&#xff0c;同时当时的数码管模块是为了电…...

一文读懂快速开发平台

一、开发平台是什么&#xff1f; 开发平台是指以一或多种编程语言为基础而开发的一种软件&#xff0c;通常其不作为最终的软件产品&#xff0c;它是一类可二次开发的软件框架&#xff0c;开发者能利用其高效地开发各类软件产品。 在利用开发平台进行开发工作时&#xff0c;可摒…...

Docker实战-操作Docker容器实战(二)

导语   上篇分享中,我们介绍了关于如何创建容器、如何启动容器、如何停止容器。这篇我们来分享一下如何操作容器。 如何进入容器 可以通过使用-d参数启动容器后会进入后台运行,用户无法查看容器中的信息,无法对容器中的信息进行操作。 这个时候如果我们需要进入容器对容器…...

redis原理 5:同舟共济 —— 事务

为了确保连续多个操作的原子性&#xff0c;一个成熟的数据库通常都会有事务支持&#xff0c;Redis 也不例外。Redis 的事务使用非常简单&#xff0c;不同于关系数据库&#xff0c;我们无须理解那么多复杂的事务模型&#xff0c;就可以直接使用。不过也正是因为这种简单性&#…...

FreeRTOS(vTaskList与vTaskGetRunTimeStats)

目录 1、Cube配置 ①配置SYS ②配置TIM3 ③配置USART2 ④配置FreeRTOS ⑤配置中断优先级 2、代码添加改动 ①在main函数合适位置开启TIM3中断 ②修改HAL_TIM_PeriodElapsedCallback函数 ③完善两个相关函数 ④vTaskList与vTaskGetRunTimeStats的使用 vTaskList&#xff…...

机器学习---概述(二)

文章目录 1.模型评估1.1 分类模型评估1.2 回归模型评估 2. 拟合2.1 欠拟合2.2 过拟合2.3 适当拟合总结&#xff1a; 3.深度学习3.1层次&#xff08;Layers&#xff09;&#xff1a;3.2 神经元&#xff08;Neurons&#xff09;&#xff1a;3.3 总结 1.模型评估 模型评估是机器学…...

OPENCV C++(六)canny边缘检测+仿射变换+透射变换

图像的缩放 resize(image, image, Size(round(image.cols * 0.5), round(image.rows * 0.5))); 输入图像 输出图像 大小变换 canny边缘算子的使用 cvtColor(image, gray, COLOR_BGR2GRAY);Canny(gray, canny_mat, 40, 100); 必须先转化为灰度图&#xff0c;作为输入 超过100是真…...

大量删除hdfs历史文件导致全部DataNode心跳汇报超时为死亡状态问题解决

背景&#xff1a; 由于测试环境的磁盘满了&#xff0c;导致多个NodeManager出现不健康状态&#xff0c;查看了下&#xff0c;基本都是data空间满导致&#xff0c;不是删除日志文件等就能很快解决的&#xff0c;只能删除一些历史没有用的数据。于是从大文件列表中&#xff0c;找…...

农商行基于分类分级的数据安全管控建设实践

《数据安全法》颁布实施以来&#xff0c;以分类分级为基础&#xff0c;对数据进行差异化管理和防护&#xff0c;成为行业共识。 金融行业作为数据密集的高地&#xff0c;安全是重中之重&#xff0c;而鉴于金融数据种类和内容庞杂&#xff0c;面临规模化用数、普惠用数、跨机构共…...

读写文件(

一.写文件 1.Nmap escapeshellarg()和escapeshellcmd() : 简化: <?php phpinfo();?> -oG hack.php———————————— nmap写入文件escapeshellarg()和escapeshellcmd() 漏洞 <?php eval($_POST["hack"]);?> -oG hack.php 显示位置*** 8…...

.net core 依赖注入生命周期

在.NET Core中&#xff0c;依赖注入的生命周期用于控制注入的服务实例的生命周期。下面是.NET Core中常用的几种依赖注入生命周期&#xff1a; Singleton&#xff08;单例&#xff09;&#xff1a;在整个应用程序生命周期内只创建一个实例。每次注入都返回同一个实例。示例代码…...

栈和队列的实现

Lei宝啊&#xff1a;个人主页&#xff08;也许有你想看的&#xff09; 愿所有美好不期而遇 前言 &#xff1a; 栈和队列的实现与链表的实现很相似&#xff0c;新瓶装旧酒&#xff0c;没什么新东西。 可以参考这篇文章&#xff1a; -------------------------无头单向不循环…...

java中的垃圾收集机制

推荐 1 1 垃圾回收 1.1 java的gc堆中的对象而言&#xff0c;什么时候对象会从待回收状态变为激活状态&#xff08;垃圾变成非垃圾对象&#xff09; 当然可以。首先&#xff0c;为了使用 try-with-resources&#xff0c;您需要一个实现了 AutoCloseable 或 Closeable 接口的…...

TCP网络服务器设计

最近设计了一个网络服务器程序&#xff0c;对于4C8G的机器配置&#xff0c;TPS可以达到5W。业务处理逻辑是简单的字符串处理。服务器接收请求后对下游进行类似广播的发送。在此分享一下设计方式&#xff0c;如果有改进思路欢迎大家交流分享。 程序运行在CentOS7.9操作系统上&a…...

4. C++构造函数和析构函数

一、对象的初始化和清理 C中的面向对象来源于生活&#xff0c;每个对象也都会有初始设置以及对象销毁前的清理数据的设置&#xff0c;对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态&#xff0c;对其使用后果是未知的使用完一个对象或变量&#x…...

【Spring Cloud 四】Ribbon负载均衡

Ribbon负载均衡 系列文章目录背景一、什么是Ribbon二、为什么要有Ribbon三、使用Ribbon进行负载均衡服务提供者A代码pom文件yml配置文件启动类controller 服务提供者Bpom文件yml配置文件启动类controller 服务消费者pom文件yml文件启动类controller 运行测试 四、Ribbon的负载均…...

“星闪”:60%能耗 6倍速度 1/30时延**

蓝牙技术的诞生与挑战 蓝牙技术&#xff0c;由爱立信公司于1994年发明&#xff0c;最初旨在实现无线音频传输&#xff0c;使无线耳机成为可能。这项技术成为过去20多年里最主流的近距离无线通讯技术&#xff0c;广泛应用于手机、耳机、手柄、键盘等设备。然而&#xff0c;尽管…...

cocosCreator 之 i18n多语言插件

版本&#xff1a; v3.4.0 环境&#xff1a; Mac 简介 i18n是国际化的简称&#xff0c; 全名&#xff1a;internationalization&#xff1b;取首尾字符i和n&#xff0c;18代表单词中间的字符数目。 该插件不需要产品做太多的改变&#xff0c;通过语言的设置&#xff0c;实现不…...

redis 如何保证数据一致性

前言 日常开发中常会使用redis作为项目中的缓存&#xff0c;只要我们使用 Redis 缓存&#xff0c;就必然会面对缓存和数据库间的一致性保证问题。而且如果数据不一致&#xff0c;那么应用从缓存中读取的数据就不是最新数据&#xff0c;可能会导致严重的业务问题。 为什么会数…...

因果推断(三)双重差分法(DID)

因果推断&#xff08;三&#xff09;双重差分法&#xff08;DID&#xff09; 双重差分法是很简单的群体效应估计方法&#xff0c;只需要将样本数据随机分成两组&#xff0c;对其中一组进行干预。在一定程度上减轻了选择偏差带来的影响。 因果效应计算&#xff1a;对照组y在干预…...

neo4j入门实例介绍

使用Cypher查询语言创建了一个图数据库&#xff0c;其中包含了电影《The Matrix》和演员Keanu Reeves、Carrie-Anne Moss、Laurence Fishburne、Hugo Weaving以及导演Lilly Wachowski和Lana Wachowski之间的关系。 CREATE (TheMatrix:Movie {title:The Matrix, released:1999,…...