Spring Boot配置文件与日志文件

news2024/10/5 17:19:39

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;

    @PostConstruct
    public 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=utf8
  username: root
  password: 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;
    
    @PostConstruct
    public 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;

    @PostConstruct
    public 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: 1
  name: 张三
  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 {

    @Autowired
    private StudentComponent studentComponent;

    @PostConstruct
    public 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: error
    com:
      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的作用如下:

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

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

相关文章

励志长篇小说《周兴和》书连载之八 处心积虑揽工程

处心积虑揽工程 如何去揽工程&#xff0c;周兴和其实早就谋划好了。 那一天&#xff0c;周兴和与爱人王琼华的姐夫严忠伦、大舅子王安全提了10来只大公鸡&#xff0c;背着两只狗腿&#xff0c;以及城里人喜欢的干豇豆等山区土特产&#xff0c;坐车来到省城成都。下了车&#x…

DeepMind将AI用于可控核聚变:将等离子体形状模拟精度提高65%

近日&#xff0c;英国AI公司DeepMind宣布取得了一项新的突破&#xff0c;成功实现了AI可控核聚变。这一技术能够在高温等离子体环境下实现精准放电&#xff0c;为核聚变技术的发展提供了新的思路和创新。 长期以来&#xff0c;相关领域的科学家们&#xff0c;一直在寻找清洁、取…

试卷去手写内容在线擦除,使用这个方法轻松达成

在数字时代&#xff0c;越来越多的人开始使用电子设备来完成日常任务。即使在考试时&#xff0c;许多学生也选择使用电子设备来写答案&#xff0c;而不是在试卷上手写。然而&#xff0c;有时候我们需要手写答案&#xff0c;但当我们想要更改或者擦除时&#xff0c;这将是一个麻…

第三章 图论 No.6负环之01分数规划与特殊建图方式

文章目录 裸题&#xff1a;904. 虫洞01分数规划&#xff1a;361. 观光奶牛特殊建图与01分数规划trick&#xff1a;1165. 单词环 裸题&#xff1a;904. 虫洞 904. 虫洞 - AcWing题库 // 虫洞是负权且单向边&#xff0c;道路是正权且双向边&#xff0c;题目较裸&#xff0c;判…

Linux CentOS安装NVIDIA GPU驱动程序和NVIDIA CUDA工具包

要在CentOS上安装NVIDIA驱动程序和NVIDIA CUDA工具包&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 准备工作&#xff1a; 确保您的系统具有兼容的NVIDIA GPU。您可以在NVIDIA官方网站上查找支持CUDA的GPU型号列表。如果您之前已经安装了Nouveau驱动程序并禁用了它…

【基于DAVE的英飞凌XMC4200的RS485通讯】

设备明细&#xff1a; 单片机&#xff1a;英飞凌开发板XMC4200 Platform2Go&#xff1b; 开发软件&#xff1a; DAVE; 测试设备&#xff1a;示波器。 调试PIN TX: PIN 2.14 接线 TX PIN 2.14&#xff1a;接示波器信号端 GND&#xff1a;接示波器地端 Debug口USB&#xff1…

如何搭建个人的GPT网页服务

写在前面 在创建个人的 GPT网页之前&#xff0c;我登录了 Git 并尝试了一些开源项目&#xff0c;但是没有找到满足我个性化需求的设计。虽然许多收费的 GPT网页提供了一些免费额度&#xff0c;足够我使用&#xff0c;但是公司的安全策略会屏蔽这些网页。因此&#xff0c;我决定…

【开源项目--稻草】Day06

【开源项目--稻草】Day06 1. 学生提问与解答功能2. 显示create.html2.1 HomeController中代码2.2 复用网页的标签导航条 3. 创建问题发布界面3.1 富文本编辑器 4.多选下列框5.动态加载所有标签和老师6. 发布问题的业务处理 1. 学生提问与解答功能 学生提问: 提问时指定标签和回…

LeetCode-Java(02)

5. 最长回文子串 首先用start和end记录开始和结尾位置&#xff0c;遍历每一个字符&#xff0c;对于每一个字符有两种情况&#xff0c;第一种情况&#xff0c;从一个字符中心扩展&#xff0c;得到len1&#xff0c;第二种情况&#xff0c;从两个字符中心扩展&#xff0c;得到len2…

MFC第二十七天 通过动态链表实现游戏角色动态增加、WM_ERASEBKGND背景刷新的原理、RegisterClass注册窗口与框架程序开发

文章目录 通过动态链表实现游戏角色动态增加CMemoryDC.hCFlashDlg.hCFlashDlg.cpp WM_ERASEBKGND背景刷新的原理RegisterClass注册窗口与框架程序开发CFrameRegister 通过动态链表实现游戏角色动态增加 CMemoryDC.h #pragma once#include "resource.h"/*内存DC类简介…

【Shell】基础语法(二)

文章目录 一、Shell基本语法文件名代换命令代换算术代换转义字符引号 二、Shell脚本语法条件测试分支结构循环 三、总结 一、Shell基本语法 文件名代换 用于匹配的字符称为通配符&#xff08;Wildcard&#xff09;&#xff0c;如&#xff1a;* ? [ ] 具体如下&#xff1a; *…

【Datawhale AI 夏令营第二期】AI 量化模型预测挑战赛

文章目录 赛题分析赛题背景赛事任务赛题数据集评价指标 Baseline实践导入模块EDA特征工程模型训练与验证结果输出 改进 赛题分析 赛题背景 量化金融在国外已经有数十年的历程&#xff0c;而在国内兴起还不到十年。这是一个极具挑战的领域。量化金融结合了数理统计、金融理论、…

DataWhale 机器学习夏令营第二期——AI量化模型预测挑战赛 学习记录

DataWhale 机器学习夏令营第二期 学习记录一 (2023.08.06)1. 问题建模1.1 赛事数据数据集情况数据中缺失值类别和数值特征的基本分布 1.2 评价指标中间价的计算方式价格移动方向说明 1.3 线下验证 DataWhale 机器学习夏令营第二期 ——AI量化模型预测挑战赛 已跑通baseline&…

排查吞吐量和 SNR 方面的 Wi-Fi 问题

服务交付对于客户在选择品牌时要考虑很重要&#xff0c;组织依靠其网络向全球客户无缝提供服务&#xff0c;强大的网络连接对于更好的最终用户体验至关重要&#xff0c;而高质量访问的关键是两个关键指标&#xff1a; 吞吐量信噪比 &#xff08;SNR&#xff09; 为了获得更好…

解决word打字卡顿问题的方法

❤ 2023.8.5 ❤ 最近整理论文&#xff0c;本来我是wps死忠粉&#xff0c;奈何wps不支持latex公式。。。 无奈用起了word&#xff0c;但是谁想字数稍微多了一点&#xff0c;word就卡得欲仙欲死&#xff0c;打个字过去2s才显示出来&#xff0c;删除的时候都不知道自己删了几个字…

基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(1)----套件概述

基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220----1.套件概述 套件概述样品申请特征系统控制和生态系统访问功能示意图系统框图跳线设置开发板原理图 套件概述 STM32C011F4Px_STSPIN220 是一款基于 STM32C011F4Px 的低压步进电机驱动套件。其中&#xff0c;STSPIN220 是一…

离散化的两种实现方式【sort或者map】

离散化 定义 把无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。通俗的说&#xff0c;离散化是在不改变数据相对大小的条件下&#xff0c;对数据进行相应的缩小。 适用范围&#xff1a;数组中元素值域很大&#xff0c;但个数不是很多。 比如将…

Navicat远程连接Linux的MySQL

打开Linux终端&#xff0c;进入root权限&#xff0c;用vim打开MySQL的配置文件 vim /etc/mysql/mysql.conf.d/mysqld.cnf将bind-address的值改为0.0.0.0 进入MySQL mysql -u root -p 将root用户改为允许远程登录 update user set host % where user root; 创建用户 CRE…

码出高效_第二章 | 面向对象_上

目录 一. OOP理念1. 概念辨析2. 四大特性1. 抽象2. 封装3. 继承4. 多态 二. 初识Java1. JDKJDK 5-11的重要类、特性及重大改变 2. JRE关于JVM 三. 类1. 概述2. 接口和抽象类1. 概念及相同点2. 不同点3. 总结 3. 内部类4. 访问权限控制1. 由来2. public/private/无/private3. 推…

无涯教程-Perl - endgrent函数

描述 此功能告诉系统您不再希望使用getgrent从groups文件中读取条目。 语法 以下是此函数的简单语法- endgrent返回值 此函数不返回任何值。 Perl 中的 endgrent函数 - 无涯教程网无涯教程网提供描述此功能告诉系统您不再希望使用getgrent从groups文件中读取条目。 语法以…