序言
1.内容介绍
本章介绍了配置文件的作用、语法结构以及基于多种方式进行配置文件的配置实现,同时对于SpringBoot如何集成logback日志框架进行日志的写入进行了详细的实战演示。
2.知识目标
- 掌握系统配置文件的结构
- 掌握系统配置文件、自定义配置文件的作用
- 掌握logback配置文件结构
3.技能目标
- 熟练读取系统配置文件,便于进行项目全局配置
- 熟练操作自定义配置文件的读取,便于多模块项目中资源文件的灵活配置
- 熟练完成与日志框架logback的集成,达到精准地记录项目运行期间
4.实践案例
- 自定义配置文件的读取操作
- SpringBoot集成logback实现日志记录
5.内容目录
- 1.配置文件概述
- 2.配置文件解析
- 3.集成logback日志框架
第1节 配置文件概述
1. 配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
• application.properties
• application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML(YAML Ain’t Markup Language)
YAML A Markup Language:是一个标记语言
.yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心,比json/xml等更适合做配置文件
标记语言:
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以数据为中心,比json、xml等更适合做配置文件;
YAML:配置例子
server:port: 8081
XML:
<server> <port>8081</port> </server>
2. YAML语法:
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:port: 8081path: /hello
属性和值也是大小写敏感;
-
字面量:普通的值(数字,字符串,布尔)
- k: v:字面直接来写;
- 字符串默认不用加上单引号或者双引号;
- “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
- name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
- ‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
- name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
-
对象、Map(属性和值)(键值对):
- k: v:在下一行来写对象的属性和值的关系;注意缩进
- 对象还是k: v的方式
friends:lastName: zhangsanage: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
-
数组(List、Set):
- 用- 值表示数组中的一个元素
pets:- cat- dog- pig
行内写法
pets: [cat,dog,pig]
第2节 配置文件解析
- 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件方式有两种。
- 编写核心配置文件application.properties内容:
- test.msg = Hello World SpringBoot
1. 使用@Value方式(推荐)
-
注意 :@Value的${}中包含的是核心配置文件中的键名。
-
编写ReadPropertiesController
-
编写属性,采用@Value进行属性值写入
@RestController public class ReadPropertiesController { @Value("${test.msg}") private String msg; @RequestMapping(value="/testValue") public String test1(){ return "@Value方式,得到的msg:"+msg; } }
2. 使用Environment方式
-
注意:该方式是依赖注入的Environment 来完成
-
需要在创建的成员变量private Environment env上加上@Autowired
-
使用env.getProperty(“键名”)即可读取对应的值
-
比如:
@Autowired private Environment env; @RequestMapping(value="/testEnv") public String test2(){ return "env方式:"+env.getProperty("test.msg"); }
3. 读取自定义配置文件信息
-
为了不破坏核心文件,但又需要有自定义的配置信息,一般会选择自定义配置文件来存放信息
-
在resources目录下创建目录 config
- 创建自定义配置信息mysql.properties,并编写内容
mysql.username=root mysql.password=1234
-
创建config代码包
- 创建类文件MySqlProperties.java,并编程
@ConfigurationProperties(prefix = "mysql",ignoreUnknownFields = false) @PropertySource("classpath:config/mysql.properties") @Component public class MySqlProperties { private String username; private String password; //生成getter and setter方法 ...... }
-
创建MySqlController.java
- 读取自定义信息
@EnableConfigurationProperties(MySqlProperties.class) @RestController public class MySqlController { @Autowired MySqlProperties mySqlProperties; @RequestMapping(value="/test") public String test(){ String username = mySqlProperties.getUsername(); String password = mySqlProperties.getPassword(); return "用户名:"+username+" , 密码:"+password; } }
第3节 集成logback日志框架
1. logback概述
- logback是一个日志框架,是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。
- logback特点:
- 支持xml、Groovy方式进行配置
- 支持配置文件中加入条件判断
- 更为强大的过滤器
- 自动压缩历史日志
- 自动去除旧的日志文件
- SpringBoot日志采用logback+slf4j
- slf4j不是具体的日志实现框架,而是提供了常用的日志接口,在使用的时候我们可以直接调用其接口,通过使用提供的,隐藏了日志的具体实现。
- logback则提供了日志记录的功能。
- logback原生实现了slf4j的api。
2. logback配置文件结构
- :配置的根节点
- :是的子节点,负责写日志的组件
- name:appender的名称
- class:appender的全限定名,对应某个具体的Appender类名,比如ConsoleAppender、FileAppender
- :是日志的格式
- %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
- %thread:打印日志的线程
- %-5level:日志级别从左显示5个字符长度,例如:DEBUG
- %logger{50}:日志输出的类名,50表示字符长度
- %msg:日志输出内容
- %n:换行符
- :用来设置日志的滚动策略,当达到条件后会自动将条件前的日志生成一个备份日志文件,条件后的日志输出到最新的日志文件中。
- 常用的是按照时间来滚动(使用的类
TimeBaseRollingPolicy
) - 还有一种就是基于索引来实现(使用的类
FixedWindowRollingPolicy
)。
- 常用的是按照时间来滚动(使用的类
- :负责把事件转换成字节数组并把字节数组写到合适的输出流
3. SpringBoot集成logback日志框架
-
需求:按照时间和日志大小滚动生成日志
-
resources目录下添加logback.xml日志配置文件
<configuration> <property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n" /> <property name="DATA_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss},%msg%n" /> <property name="LOG_LEVEL" value="INFO"/> <!-- 标准输出日志 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${LOG_PATTERN}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>${LOG_LEVEL}</level> </filter> </appender> <!-- 数据采集日志记录, 保存到文件 --> <appender name="COLLECT_ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>data/data_file.%d{yyyy-MM-dd}_%i.log</fileNamePattern> <maxFileSize>10MB</maxFileSize> <maxHistory>10</maxHistory> <totalSizeCap>10GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <encoder> <pattern>${DATA_PATTERN}</pattern> </encoder> </appender> <!-- 指定日志输出级别 --> <logger name="cn.com.chinahitch.springboot_hello" level="${LOG_LEVEL}" addtivity="false"> <appender-ref ref="COLLECT_ROLLING" /> </logger> <root level="${LOG_LEVEL}"> <appender-ref ref="STDOUT" /> </root> </configuration>
-
在HelloController.java中添加日志记录实现
@RestController public class HelloController { //创建Logger对象 private static Logger logger = LoggerFactory.getLogger(HelloController.class); @RequestMapping(value="/hello") public String index(){ //日志信息写入 logger.info("HelloController.................."); return "Hello World!"; } }
-
启动服务,执行http://localhost:8080/hello,观察效果
-
控制台生成日志
-
本地生成日志文件
-