Spring Boot配置文件 Spring日志文件相关的知识
在上文中,小编带领大家创建了一个Spring Boot项目,并且成功的执行了第一个SPring Boot项目(在网页上运行hello world)
那么,本文的主要作用便是带领大家走进:Spring Boot配置文件 && Spring日志文件
首先,来带领大家看一下Spring Boot的配置文件吧!!
Spring Boot的配置文件:
Spring Boot的配置文件的作用:整个项目中所有的重要数据都是在配置文件中配置的!
- 数据库的连接信息(包含用户名和密码的设置)
- 项目的启动端(设置端口号)
- 第三方系统的调用密钥等信息
- 用于发现和定位问题的普通日志和异常日志等
那么,我们来想象一下,如果没有配置信息,那么Spring Boot项目就不能连接和操作数据库,甚至是不能保存可用于排查问题的相关日志,所以配置文件的作用也是非常重要的!!
对于Spring Boot配置文件的格式,目前主要有两种:
Spring Boot配置文件的格式
- .properties
- .yum(yaml)
特殊说明:
- 两个配置文件从功能上来说是可以同时存在的,但是企业中,通常会规定使用某一种格式的配置文件
- 如果同一个配置出现再两种格式的配置文件的话,那么以.properties为主!
那么,接下来,我们来看一下.properties配置文件说明吧!
.properties配置文件是最早期的配置文件格式,也是创建Spring Boot项目默认的配置文件
.properties是以键值对的形式配置的,key和value之间,以“=”连接的
如:配置项目端口号:server.port=8084
其他配置:
# 配置数据库的连接字符串 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=zhao05306910a spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 设置 Mybatis 的 xml 保存路径 mybatis.mapper-locations=classpath:mybatis/*Mapper.xml # 配置打印 MyBatis 执行的 SQL mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 配置打印 MyBatis 执行的 SQL logging.level.com.mybatis.demo=debug # 配置运行环境 spring.profiles.active=dev
配置文件中,以“#”来添加注释文本!!
注意:在上述的配置文件中,涉及一些小编自定义的内容!!请各位老铁不要直接复制粘贴就使用,然后运行失败再来找小编吐槽~~
配置项目类:
- 系统配置项:比如server.port/spring.datasource.url……《——》系统
- 用户自定义配置(非系统配置项)《——》key用户自定义
设置项目端口号:
server.port=9090《——》更改端口号
用户自定义配置:
javaclass=java101
如果在项目中,想要主动的读取配置文件(用户自定义)中的内容,可以使用@Value注解来实现!
@Value("${servler.port}") //注意一定要是${key}的格式!! @Value("${javaclass}")
那么,我们来看一下小编的代码吧!
@Controller
@ResponseBody //加在类上,表示当前类中的所有方法返回的都是非静态页面的数据
public class Read {
@Value("${test.javaclass}")
private String myconfig;
@RequestMapping("/sayHi")
private String sayHi(){
return myconfig;
}
}
经过上述的代码,我们可以看出:
properties优点:
- 系统默认的配置文件
- properties配置项的优先级比yml高
- 格式简单,不易出错
缺点:写法比较冗余!
yml优点分析:
- yml是一个可读性高,写法简单,易于理解,它的语言和JSON语言类似
- yml支持更多的数据类型,它可以简单表达清单(数组),散列表,标量等数据形态,它使用空白符号缩进和大量依赖的外观的特色,特别适合用来表达式编辑数据结构,各种配置文件等
- yum支持更多的编程语言,它不止是Java中可以使用,在Golong,PHP,Python,Ruby,JavaScript,Perl中也可以使用。
yml是树形结构的配置文件,它的基础语法是“key: value"(注意,key和value之间使用的是英文的冒号加空格组成,空格不可省略!)
使用yml连接数据库:下述代码来自于笔者的项目中(含有不少自定义的内容,请各位老铁自行分析)
# 配置数据库的连接字符串
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8
username: root
password: 12345678
driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
configuration: # 配置打印 MyBatis 执行的 SQL
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 配置打印 MyBatis 执行的 SQL
logging:
level:
com:
example:
demo: debug
yml中配置不同数据类型及null
字符串:
string-value1: hello/n world # /n指换行符 string-value2: 'hello world' # 单引号 string-value3: "hello world" # 双引号
布尔类型:
boolean-value1: true boolean-value2: fales
整数:
int-value1: 10 int-value2: 0b1010_0111_0100_1010_1110 #二进制
浮点数:
float-value1: 3.14159 float-value2: 3.14159e-5 #科学计数法
null:
#null演示: ~ #TAB键上面的波浪线 null-value: ~
yml读取配置的方式和properties相同,使用@Value("${key}")的格式!
那么,如何在yum配置文件中配置对象呢??
student: id: 1 name: java age: 18 #注意空格
当然,我们也有着另一种写法:(行内写法)
student: {id: 1, name: java, age: 18} #注意空格
如果在yml配置文件中配置了对象,此时在使用@Value的格式,只能得到某单个属性,不能得到完整的student对象,因此,我们使用@ConfigurationProperties来获取!!
接下来,我们来看一下Spring Boot不同平台的配置规则吧!!package com.example.demo.controller; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component //存对象,随着Spring Boot的启动而启动 @Setter @Getter @ToString @ConfigurationProperties("student") public class StudentComponent { private int id; private String name; private int age; @Autowired //取对象(注入) private StudentComponent studentComponent; @PostConstruct public void doPostCnostruct(){ System.out.println(studentComponent); } }
Spring Boot不同平台的配置规则;
- 必须有主配置文件,主配置文件名必须是:application.yml(或者是:application.properties)
- 不同平台的配置文件,每个平台拥有一个配置文件,配置文件的名称有要求:application-xxx.yml(或者是:application-xxx.properties)
application-xxx.yml(或者是:application-xxx.properties) 如: 开发环境: application-dev.yml(或者是:application-dev.properties) 测试环境: application-text.yml(或者是:application-text.properties) 生成环境: application-prod.yml(或者是:application-prod.properties) 主配置文件:application.yml(或者是:application.properties)//存放公共资源项
Spring日志文件:
对于日志,想必各位老铁应该知道有啥用吧!!作用很大哟!
- 记录错误日志和警告日志(发现和定位问题)
- 用户日志
- 系统日志
- 程序执行日志
- ………………
那么,在Spring中,我们有着以下的疑问:
- Spring Boot内置了日志框架(不然也输出不了日志)
- 默认情况下,输出的日志并非是开发者自定义和打印的,那开发者怎么在程序中自定义打印日志呢??
- 日志默认是打印在控制台上的,而控制台的日志是不能被保存的,那么,怎么把日志永久的保存下来呢??
那么,我们有着:
Spring Boot日志打印:
- 得到日志对象
- 使用日志对象提供的方法打印日志
那么,我们来看一下接下来的代码:
@Controller
@ResponseBody //加在类上,表示当前类中的所有方法返回的都是非静态页面的数据
public class TestController {
//得到日志对象
private static final Logger log= ILoggerFactory.getLogger(TestController.class);
/**
* private :独有的日志
* static :方法中调用
* final:不能被修改
* Logger :日志类型(org.slf4j包底下)
* TestController.class :类名
*/
//打印日志
@RequestMapping("/sayHi")
public String sayHi(){
log.trace("I'm trace"); //自定义内容
log.trace("I'm debug");
log.trace("I'm info");
log.trace("I'm warn");
log.trace("I'm error");
return "hello world";
}
}
在上述代码中我们需要注意的是:Logger属于org.slf4j包底下!!
根据最后的打印结果,有:打印日志时间,日志级别,打印日志线程id,打印日志线程名称,包名.类名,日志内容(自定义)等内容。在此感兴趣的各位老铁可自行测试,小编便不在带领大家进行进一步的测试了!!
@RestController //@RestController = @Controller + @ResponseBody
public class studentController {
private static final Logger log= ILoggerFactory.getLogger(studentController.class);
@RequestMapping("/stu/sayHi")
public String sayHi(){
log.info("student info");
log.error("student error");
return "student sayHi";
}
}
接下来,我们来看一下日志级别吧!
日志级别:
- trace:微量少许的意思,级别太低
- debug:需要调试的时候的关键信息打印
- info:普通的打印信息(默认日志级别)
- warn:警告,不影响使用,但是要注意的问题
- error:错误信息级别较高的错误日志信息
- fatal:致命的,因为代码异常导致程序退出执行的事件
值得注意的是:上述的列出的几个级别:从上往下,级别由低到高,trace和debug由于级别太低,在日志中看不到,只有从info(默认级别)往下更高的级别,在日志中才可以看到!!
设置日志级别:
设置日志级别:application.yml(application.properties)配置文件中:
#日志级别设置(yml文件)
logging
level:
root: error #默认级别为error
com:
example:
demo:
controller: trace #com.example.demo.controller文件专门设置trace
注意:上述的配置文件是在application.yml中配置的,对于application.properties配置文件,写法不一样,但是,大致的内容是一样的,所以在此小编便不再做过多的讲述!!
日志持久化:
在之前的日志都是输出在控制台上的,然而,在生产环境上,咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化!
想要将日志持久化,只需要在配置文件中指定日志的存储目录,或者是指定日志保存文件名之后,Spring Boot就会将控制台的日志写到相应的目录或者文件下了!
Spring Boot日志持久化(将日志保存下来)有两种方式:
- 设置日志保存路径
具体代码如下:
#设置日志保存路径 Logging: file: path: D:\\home\\ #防止出现转义字符! #运行后,会自动创建一个spring.log的文件,用VS Code打开,会查看当前日志信息! #尽量不要将保存的盘符放在系统盘(C盘),路径中不要出现中文!
尽量不要将保存的盘符放在系统盘(C盘),路径中不要出现中文!
观察得出结论,日志文件一旦产生,那么日志文件及其内容就会永久的保存,不会出现文件或内容的丢失,无论何时,无论和操作都会保存以上的特性!
- 设置日志保存名称
#设置日志保存名称 Logging: file: name: springBoot.log #没有指定目录,默认放在该项目的文件夹下! #运行后,在该项目的文件夹下会自动创建一个springBoot.log的文件,用VS Code打开,会查看当前日志信息! #尽量不要将保存的盘符放在系统盘(C盘),路径中不要出现中文!
1.没有指定目录,默认放在该项目的文件夹下! 2.运行后,在该项目的文件夹下会自动创建一个springBoot.log的文件,用VS Code打开,会查看当前日志信息! 3.尽量不要将保存的盘符放在系统盘(C盘),路径中不要出现中文!既指定保存路径又指定保存名称:
Logging: file: name: D\\home\\springboot.log
生产级别的日志分类:根据业务场景来订
- 程序运行日志(放在文件中)
- 业务日志(存放在数据库中)
日志大小问题:
Logging.logback.rollingpolicy.max-file-size 《——》 10mb
如果超过10mb,则会自动创建新的文件(名称为原文件名+1,2,3……n);
其他扩展:
综合练习:
将controller包下的error级别以上的日志保存到log.all.log下
将service下warn级别以上的日志保存到log.all.log下
实现关键步骤:
- 不同包定义不同的日志级别
- 使用日志对象打印所有类型的数据
- 设置固定的日志保存文件名
如果你已经创建好一个Spring Boot项目了,那么如何快速添加Spring Boot依赖呢??
IDEA安装插件EditStarters
然后在pom.xml文件中,右键,Generate…,EditStarters……,🆗
然后搜索你想要添加的依赖,添加后刷新Maven(右上角)即可!!