Spring Boot配置文件与日志

news2024/11/24 10:45:44

目录

    • 配置文件
      • 配置文件格式
        • .properties
        • yml
      • 读取配置文件内容
      • 根据不同环境配置不同属性
    • 日志
      • 自定义日志的打印
      • 更简单的日志打印
      • 日志级别
        • 日志级别的设置
      • 日志的持久化

配置文件

Spring Boot项目的重要数据都是在配置文件中设置的。配置文件可以包含各种属性和值,用于定义应用程序的各种配置选项,如数据库连接信息、日志级别、缓存策略等。
配置文件把配置信息与代码分离。就拿数据库连接来说,程序员调试运行时连接的数据库肯定和正式发布连接的数据库是不同的,假如直接写死在代码中,后续如果出现问题也没有办法修改。但是配置文件是可修改的,有哪些不合适的直接在配置文件中修改即可,无需重新编译和部署代码。
此外,配置文件具有很高的灵活性。应用程序在不同的环境下(如开发、测试、生产)可能有不同的部署需求,例如在开发环境下,使用8080作为端口号没问题,但在生产环境下就可能出现冲突。
除此之外,配置文件还可以保证安全性(某些敏感信息如数据库密码放在配置文件中可以更好地保护)等。

配置文件格式

配置文件主要有.properties和.yml两种

.properties

.properties属于默认配置文件,当我们新建一个Spring Boot项目时,在resources目录下会自动生成一个application.properties配置文件:
默认配置文件
当同一个项目中同时有.properties和.yml两种配置文件时,并不会发生冲突,但如果两个配置文件配置了相同的属性,则以.properties配置为准。
properties是以键值对的形式配置的:

# 设置端口号
server.port=8181

# 连接数据库(要添加mysql依赖)
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

除了设置这些属性,还可以设置自定义属性,例如设置"myTest=zhangsan"

yml

yml是YAML(Yet Another Markup Language) 的缩写,即另一种标记语言。
yml通过"key: value"的形式来设置属性(注意冒号与value之间要有一个空格):

# 设置端口号
server:
  port: 9090

# 连接数据库
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
    username: root
    password: root

从写法上来看,可以发现:

  • yml的可读性更高,写法更简单,类似于JSON
  • yml支持更多的数据类型,例如数组、散列表等
  • yml支持更多的编程语言,除Java可以使用之外,Python、PHP、JavaScript、Golang等语言中也可以使用

读取配置文件内容

在代码中读取配置文件中的内容,无论properties还是yml,都需要使用@Value注解:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class TestController {
	
	// 前面properties中设置了myTest=zhangsan
    @Value("${myTest}")// 这里的${}是必要的
    public String myTest;

    @RequestMapping("/hi")// 设置路由
    public String hi() {
        return "你好," + myTest;
    }
}

启动服务器后通过浏览器访问hi路由可以得到:
路由访问
在日志中也可以发现:
这里的端口号也被改为了8181(properties配置文件)而不是9090(yml配置文件)
端口号
当然一般情况下,一个项目不会出现既有properties又有yml的情况。

根据不同环境配置不同属性

前面提到不同环境的配置可能不同,那就需要多个配置文件。例如application-dev.yml配置文件和application-prod.yml配置文件(注意任何配置文件都要以application为开头,无论是properties还是yml):

application-dev.yml文件内容:

# 开发环境端口号
server:
  port: 8181

application-prod.yml文件内容:

# 生产环境端口号
server:
  port: 8282

至于使用哪个配置文件的端口号,则需要在application.yml文件中添加spring.profiles.active属性:
例如选用生产环境:

spring:
  profiles:
  	#选用生产环境
    active: prod

再次运行可以发现端口号已经设置为了生产环境的端口号(8282):
查看端口号

日志

日志是用来输出信息的,每次项目启动,控制台就会自动打印一些日志信息:
日志信息
那么日志有什么用呢?

  • 日志记录了程序运行过程中地各种信息,通过查看这些日志就可以快速地分析遇到的问题,极大地提高了调试和故障检测地效率。
  • 日志还可以记录程序地运行状态和性能情况,及时的发现并解决某些潜在问题
  • 日志还可以用来记录用户的登录状态,监控用户行为,保证安全性

自定义日志的打印

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {

    //获取日志对象
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);
    @RequestMapping("/test")
    public void test() {
        // Logger共提供了五种日志
        logger.trace("trace日志");
        logger.debug("debug日志");
        logger.info("info日志");
        logger.warn("warn日志");
        logger.error("error日志");
    }
}

注意这里的Logger选择:
获取Logger对象

Spring Boot 内置的日志框架是slf4j,但slf4j并不会真正地实现日志,实际上slf4j只是一个中介,日志的实现另有其人。由于日志的实现并不算很难,有多个公司实现了日志,但他们的写法不会完全一样,假如使用A公司的日志写法,万一A公司突然出现了问题,就需要紧急替换日志的写法为B公司。像这样的人工替换是很麻烦的。于是就使用slf4j统一写法,再内部替换成和它对接的实际框架(Spring Boot默认使用logback框架)。

写好代码以后,在浏览器上访问test:
访问test
在控制台上可以发现打印了info日志、warn日志和error日志:
测试打印日志
左数第二个属性就是日志级别名,最右边就是日志信息。

更简单的日志打印

通过前面的方法来打印日志信息看起来是比较麻烦的,为了简化操作,可以添加lombok依赖,然后使用注解的方式来获取日志对象:

import lombok.extern.slf4j.Slf4j;// 导入对应包
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@RequestMapping("/user")
@Slf4j// 使用@Slf4j来代替那一长串来获取Logger对象
public class UserController {

    @RequestMapping("/test")
    public void test() {
        // 使用注解就不用在像上面这样获取了,可以直接使用log对象
        // 注解生成的对象名就是log
        log.trace("trace日志");
        log.debug("debug日志");
        log.info("info日志");
        log.warn("warn日志");
        log.error("error日志");
    }
}

lombok除了可以简化获取日志的操作外,还可以通过注解的方式帮助生成Getter和Setter方法、重写toString、hashCode、equals等方法,非常之方便。

lombok的实现原理
lombok的实现原理其实就是在编译阶段把注解替换成相应的代码填进去。
可以在服务器运行后查看target中的编译过的文件:

由此可得,lombok的实现并不高深。

日志级别

虽然日志成功打印了,但只打印了三个,明明之前写了五个,那前两个日志呢?这就涉及到日志的级别问题了。
日志的级别由低到高分为六种:trace、debug、info、warn、error、fatal
而Spring Boot的默认日志级别是info,因此只能打印info日志或比info级别更高的日志。
前面写了五种日志的级别,没有fatal,这是因为一旦发生fatal级别的错误,程序就会立即退出执行。

日志级别的设置

在配置文件中设置logging.level属性即可修改日志级别,例如:

# 设置根路径的日志级别为debug
logging:
  level:
    root: debug

再次重启服务器并打开浏览器访问就会发现多了很多的日志,同时自定义的日志也可以多打印debug日志的内容了:
日志信息
假如只关注自定义日志的信息又该如何操作呢:

# 设置根路径的日志级别为warn设置UserController类的日志级别为trace
logging:
  level:
    root: warn
    # 前面是包名,最后是类名
    com.example.demo.UserController: trace

重启服务器可以发现那些默认的日志信息不见了,同时也可以打印自定义的trace日志了:
日志打印
(上面那个logo不是以日志的形式打印的,而是通过println函数直接输出到控制台上的)

日志的持久化

仅仅把日志打印到控制台上显然是不够合理的,因为每次重启服务器控制台上的内容都会消失。为了日志可以长久地保存下来,需要在配置文件中指定存储的路径或文件名:
指定path属性默认日志名为spring.log:

logging:
  file:
  	#任意指定路径即可
    path: D:\\

重启服务器后就可以在对应路径找到log文件:
日志文件
访问路由后再打开日志就会发现日志中已经有内容了:
日志内容
后续每次访问一次都会添加相应的日志进来,重启服务器也不会消失:
这样就实现了日志的持久化
设置name属性可以修改日志的默认名:

logging:
  file:
  	# 设置日志名为spring-log,前面可以加路径名(不加默认放到项目目录下)
    name: spring-log
  level:
    root: warn
    com.example.demo.UserController: trace

日志文件
效果和设置path属性是一样的。

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

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

相关文章

LeetCode_面试题 01.01. 判定字符是否唯一

题目描述 面试题 01.01. 判定字符是否唯一https://leetcode.cn/problems/is-unique-lcci/ 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s "leetcode" 输出: false 示例 2: 输入: s "abc"…

中国黄金品牌怎么代理

想选择一个项目创业其实不难,中国黄金这个品牌相信大家都已经相当的熟悉,它成立于1979年,是业界中的佼佼者,一直致力于为消费者提供黄金、白银、珠宝等的产品,无论是产品质量还是服务,都在行业中处于领先地…

数据备份、还原、视图、索引 操作练习

目录 备份与还原: 题目要求: 索引和视图 题目要求: 备份与还原: 在数据库booksDB中创建表books、authorbook、authorbook: 题目要求: 1、mysqldump -uroot -pRyh201314% booksDB > /backup/db/boo…

jsonschema networknt json-schema-validator 高级能力json 数字很大时, 变成什么类型

入参校验产品化 schema_个人渣记录仅为自己搜索用的博客-CSDN博客 自动变成了bigInteger类型. 哪怕你的jsonSchema 配置的是integer , 不冲突.

Redis深入——管道、发布订阅、主从复制、哨兵监控和集群

前言 在前面的学习中,我们已经了解了Redis的基本语法以及Redis持久化和事务的概念。而在这篇文章中我们继续来梳理管道、发布订阅、主从复制、哨兵监控和集群的知识,理解Redis主从复制到集群分片的演进过程,希望对正在学习的小伙伴有一定的帮…

1039家校通SQL注入获取管理员权限

我们承认伟人在历史过程中的贡献。可人类生活的大厦从本质上说,是由无数普通人的血汗乃至生命所建造的。伟人们常常企图用纪念碑或纪念堂来使自己永世流芳。真正万古长青的却是普通人的无人纪念碑——生生不息的人类生活自身。是的,生活之树常青。 漏洞…

Signal-iOS 5.9.0编译问题

1.当我们使用pod管理 pod SDWebImage/WebP , 执行 pod install 时,发生报错.先看具体报错 : 截屏2020-07-06 上午11.12.15.png 2.报错产生原因是由于git clone 的地址是 https://chromium.googlesource.com/webm/libwebp,需要FQ 3.不想FQ,可以使用github上的地址https://githu…

Python实现word简历中图片模糊

Python实现word简历中照片模糊——保护个人隐私的有效方法 一、引言背景 在现代招聘流程中,电子简历成为了主要的招聘方式之一。然而,简历中包含的个人信息往往涉及隐私问题,特别是照片。为了保护求职者的个人隐私和数据安全,许多…

MySQL数据备份与恢复,索引,视图的简单练习

目录 一. 数据备份与恢复 (1)素材如下: 创建表格如下: (2) 1、使用mysqldump命令备份数据库中的所有表 2、备份booksDB数据库中的books表 3、使用mysqldump备份booksDB和test数据库(test数…

2023最新版本Activiti7系列-身份服务

身份服务 在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。针对这种情况可以给任务设置多个候选人或者候选人组,可…

面试题更新之-HTML5的新特性

文章目录 导文新特性有哪些?HTML5的新特性带来了许多好处 导文 面试题更新之-HTML5的新特性 新特性有哪些? HTML5引入了许多新特性和改进,以下是一些HTML5的新特性: 语义化标签:HTML5引入了一系列的语义化标签&#…

layui实现动态添加选项卡

前言 上一篇博客介绍了树形菜单的实现,这一篇将继续完善通过点击左侧树形菜单实现动态打开选项卡Tab 一. 什么是Tab选项卡 Tab广泛应用于Web页面,因此我们也对其进行了良好的支持(简约风格、卡片风格、响应式Tab以及带删除的Tab等等&#…

机器视觉初步13:3D相机介绍

文章目录 1. 结构光(Structured Light)2. 飞行时间(Time of Flight,ToF)3. 双目视觉(Stereo Vision)4. 线扫描(Line Scan)5. 散斑(Speckle) 在工业…

算法训练营第三十七天||● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

● 738.单调递增的数字 为了方便遍历,先将int型转换为string类型,从后往前遍历,记住要设定一个flag标志 例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想…

(数据结构)(C++)数组——约瑟夫环求解

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream>#define MaxSize 10using namespace std;void josephus(int n,int m)//一共n个人数到m的出列 {int p[MaxSize];int i,j,t;for(i0;i<n;i){p[i]i1;//构建初始序列&#xff08;1,2,3,4.....) } t0;//首次报数起始位…

【剑指offer】17. 正则表达式匹配(java)

文章目录 正则表达式匹配描述示例1示例2示例3示例4思路完整代码 正则表达式匹配 描述 请实现一个函数用来匹配包括’.‘和’*的正则表达式。 1.模式中的字符’.表示任意一个字符 2.模式中的字符’*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题…

scrapy---爬虫界的django

1介绍 scrapy架构 引擎(EGINE)&#xff1a;引擎负责控制系统所有组件之间的数据流&#xff0c;并在某些动作发生时触发事件。大总管&#xff0c;负责整个爬虫数据的流动 调度器(SCHEDULER)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个U…

[QT编程系列-8]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自定义对话框

目录 3. QT窗体设计 3.6 自定义对话框 3.6.1 种类 3.6.2 输入对话框​编辑 3.6.3 字体对话框 3.6.4 文件对话框​编辑 3.6.5 颜色对话框 3.6.6 输出对话框​编辑 3.6.7 进度条对话框​编辑 3.6.8 自定义对话框​编辑 3. QT窗体设计 3.6 自定义对话框 在QT中&#xff…

软考A计划-系统集成项目管理工程师-项目人力资源管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Pytorch学习笔记 | 深度学习框架简介 | 环境安装

文章目录 知名深度学习框架的开发公司,以及框架的演变过程最流行的两个框架:pytorch和tensorflow两个框架最核心的区别是什么?什么是动态图和静态图环境安装CUDA是什么如何查看自己电脑的显卡类型如何安装cuda如何确认安装好了呢?如何测试安装pytorch知名深度学习框架的开发…