您现在的位置是:首页 >技术杂谈 >SpringBoot配置文件和日志网站首页技术杂谈
SpringBoot配置文件和日志
目录
②新建一个实体类(与该对象保存一致)并注入到Spring容器
SpringBoot配置文件
SpringBoot配置文件的作用
项目中的重要数据写在配置文件当中
如:数据库的连接信息,项目的启动端口,第三方系统的日志信息等等,如果没有我们的配置文件,数据库就不能连接。
降低代码耦合
在使用servlet的时候,包括使用JDBC编程的时候,数据库的连接信息都是写在java代码中的,在SpringBoot框架中则要写到配置文件中。
写到配置文件中就可以降低代码的耦合程度。
配置文件中的内容便于开发者进行修改,如果写在java文件中,那么编译后的.class文件就是只可以读的,不能进行修改。而且写到配置文件中也便于开发者可以在配置文件中看到项目部署的端口号,数据库连接情况等等。
SpringBoot配置文件的格式
一般是两种格式;
properties(默认)
yml(yaml)
如果这两个格式的配置文件都有的时候(不建议出现两种),优先以properties格式的为主,这也是SpringBoot约定大于配置的一个体现。
注意:两种格式,都得以application.properties和application.yml命名,因为SpringBoot启动的时候只读取application命名的配置文件。
properties配置文件
键值对Key=Value的方式
可以使用系统的配置,也可以自定义
读取配置文件中的内容(@Value注解使用${}格式读取)
使用@Value注解来读取配置文件的内容,使用${}获取到配置文件中内容的赋值。
package com.example.demo.Controller;
import org.springframework.beans.factory.annotation.Value;
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 {
@Value("username")
private String name;
@RequestMapping("/sayHi")
public String sayHi(){
return "Hi "+ name;
}
}
如果不加${}相当于@Value中的字符串赋值给了name。
如果要获得赋值的配置文件则需要使用${}来获取。
package com.example.demo.Controller;
import org.springframework.beans.factory.annotation.Value;
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 {
@Value("${studentname}")
private String name;
@RequestMapping("/sayHi")
public String sayHi(){
return "Hi "+ name;
}
}
properties优缺点
优点:
1.是系统默认的配置文件
2.优先级比yml高
3.格式简单
缺点:写法比较冗余(包名必须全都写上,很多相同包名下的配置都要写上包名)
yml配置文件
yml是yaml的缩写,在使用配置文件时使用yml和yaml都可以,推荐使用yml。
yml可读性高,写法简单,易于理解,语法和JSON相似
yml特点:
1、写法简单、可读性高;
2、支持更多的数据类型
3、支持跨语言的使用(最大优势)
yml语法
yml也是按照key:value的方式存储的,但是它的写法比properties更简洁。
tab和空格不能少,否则容器无法识别
package com.example.demo.Controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//==@Controller+@ResponseBody
public class StudentController {
@Value("${server.bbbb}")
private String name;
@RequestMapping("/sayhi")
public String sayHi(){
return "Hi "+name;
}
}
yml对于单双引号的问题
前两种:
加双引号;
在网页中 转义字符不好看出来。
yml配置对象多行写法
#对象多行写法
student :
id : 1
name : 张三
age : 18
yml 配置文件单行写法
#对象单行写法
student2 : {id : 2, name : 李四, age : 19}
获取对象:
①在yml配置文件中存放一个对象
②新建一个实体类(与该对象保存一致)并注入到Spring容器
package com.example.demo;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
public class Student {
private int id;
private String name;
private int age;
}
③从配置文件中获取该对象
④通过属性注入获取对象
package com.example.demo.controller;
import com.example.demo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class StudentController {
@Autowired
private Student student;
public Student getStudent(){
return student;
}
}
yml配置集合
#集合
#myName对应于实体类
#name是集合
myName : { name : [ 张三, 李四, 王五 ] }
①在yml中存放一个集合
②注入集合
③获取bean对象
package com.example.demo.controller;
import com.example.demo.MyNameController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/hello")
public class ListController {
@Autowired
private MyNameController myNameController;
@RequestMapping("/hi")
@ResponseBody
public String getNames(){
return myNameController.getName()+"";
}
}
properties和yml有什么区别(重要)
区别1:properties仅仅支持Java项目,但是yml支持包括Java在内的多种语言(例如python);
区别2:properties的key写起来比较冗余,不像yml那样简易。(yml支持层级,层级之间采用缩进的方式)
区别3:yml支持更多的数据类型(string,object,list)
SpringBoot日志
日志的作用:
1、发现和定位问题,报错了不查看日志,难以发现和定位问题
2、记录用户的登录日志,方便分析用户的登录状态,是恶意还是正常
3、记录系统的操作情况,定位操作人,操作时间和操作行为等等
4、记录程序的执行时间,方便后续的优化等等....
如何使用日志:
SpringBoot内置了日志框架,所以会有默认的日志。
使用日志,首先我们要找到日志的门面SLF4J ,然后根据SLF4J获取到日志对象,再进行使用。
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/hello")
public class UserController {
//通过slf4j获取日志对象
private static Logger logger= LoggerFactory.getLogger(UserController.class);
//输出日志
@RequestMapping("/hi")
public void sayhi(){
logger.info("hi i'm info");
logger.debug("hi i'm debug");
logger.error("hi i'm error");
logger.warn("hi i'm warn");
}
}
日志的级别 (由低到高):
trace
少许的日志,这一个是最低的级别。debug
这个级别用于"调试"的级别info
这个级别是普通的日志信息。(如果不指定日志的级别,那么默认就是这个)warn
警告日志:有一些地方存在警告的风险的,就需要使用到这个warn级别的日志error
错误级别的日志,如果发生了一些错误,那么就需要使用这个级别来记录。fatal
发生了比较致命的情况,需要由系统来进行输出,不可以由用户手动进行debug输出。
默认的级别是info,所以一般情况下只会出现info及其以上的日志,较为低级的日志一般不会出现。
日志的级别设置:
日志的默认级别是info,所以info以上的日志一般不会出现,但是这个默认的级别是可以通过配置文件进行修改的。(注意:fatal是由系统输出的,不能我们手动进行debug输出)
当我们修改默认级别为error的时候,控制台就基本没有日志
上述是全局日志的设定,当然也有局部日志的设定,但是局部日志的设定要服从全局
日志的持久化:
日志的持久化,说白了就是把日志存在本地的磁盘
①配置日志的保存路径
这里的路径中要用“/” ,因为“/”会被认为是特殊符号
目标目录下就会有个日志文件:
②配置日志的文件名字
③更加简易的添加日志的方式:添加lombok
1、安装一个EditStarters插件:
2、添加@Slf4j注解
那么为什么@Slf4j就可以生成一个log对象呢?这个主要是因为在编译时期@Slf4j会为当前类当中设置一个静态从常量属性,这一个属性就是log。
我们可以看看UserController的字节码文件:
lombok常用注解:
⽇志注解 :
注解 | 作⽤ | ||
@Slf4j | 添加⼀个名为 log 的⽇志,使⽤ slf4j |
基本注解 :
注解 | 作用 | |||||
@Getter | ⾃动添加 getter ⽅法 | |||||
@Setter | ⾃动添加 setter ⽅法 | |||||
@ToString | ⾃动添加 toString ⽅法 | |||||
@EqualsAndHashCode | ⾃动添加 equals 和 hashCode ⽅法 | |||||
@NoArgsConstructor | ⾃动添加⽆参构造⽅法 | |||||
@AllArgsConstructor | ⾃动添加全属性构造⽅法,顺序按照属性的定义顺序 | |||||
@NonNull | 属性不能为 null | |||||
@RequiredArgsConstructor | ⾃动添加必需属性的构造⽅法,final + @NonNull 的 属性为必需 |
组合注解:
注解 | 作用 | |||||
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor |
注解的原理,就是在编译时期添加对应的方法