SpringBoot 配置文件格式
Properties
格式
@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前缀的所有配置进行绑定
@Data
public class Person {
private String name;
private Integer age;
private Date birthDay;
private Boolean like;
private Child child; //嵌套对象
private List<Dog> dogs; //数组(里面是对象)
private Map<String,Cat> cats; //表示Map
}
@Data
public class Dog {
private String name;
private Integer age;
}
@Data
public class Child {
private String name;
private Integer age;
private Date birthDay;
private List<String> text; //数组
}
@Data
public class Cat {
private String name;
private Integer age;
}
#private String name;
person.name=张三
#private Integer age;
person.age=18
#private Date birthDay;
person.birthDay=2010/10/12 12:12:12
#private Boolean like;
person.like=true
#private Child child; 嵌套对象
person.child.name=李四
person.child.age=12
person.child.birthDay=2018/10/12
#private List<Dog> dogs 数组(里面是对象)
person.child.text[0]=abc
person.child.text[1]=def
person.dogs[0].name=小黑
person.dogs[0].age=3
person.dogs[1].name=小白
person.dogs[1].age=2
#private Map<String,Cat> cats(map)
person.cats.c1.name=小蓝
person.cats.c1.age=3
person.cats.c2.name=小灰
person.cats.c2.age=2
YAML
格式
@Component
@ConfigurationProperties(prefix = "person") //和配置文件person前缀的所有配置进行绑定
@Data
public class Person {
private String name;
private Integer age;
private Date birthDay;
private Boolean like;
private Child child; //嵌套对象
private List<Dog> dogs; //数组(里面是对象)
private Map<String,Cat> cats; //表示Map
}
@Data
public class Dog {
private String name;
private Integer age;
}
@Data
public class Child {
private String name;
private Integer age;
private Date birthDay;
private List<String> text; //数组
}
@Data
public class Cat {
private String name;
private Integer age;
}
person:
#private String name;
name: 张三
#private Integer age;
age: 18
#private Date birthDay;
birthDay: 2010/10/10 12:12:12
#private Boolean like;
like: true
#private Child child 【对象】
child:
name: 李四
age: 20
birthDay: 2018/10/10
text: ["abc","def"]
#private List<Dog> dogs; //数组(里面是对象)
dogs:
# 第一个 dog
- name: 小黑
age: 3
# 第二个 dog
- name: 小白
age: 2
#private Map<String,Cat> cats; //表示Map
cats:
#Cat 对象第一种表示方式
c1:
name: 小蓝
age: 3
#Cat 对象第二种表示方式
c2: {name: 小绿,age: 2} #对象也可用{}表示
SpringBoot 日志配置
日志简介
规范:项目开发不要编写
System.out.println()
,应该用日志记录信息
SpringBoot
使用SLF4j
作为内部日志门面,但底层日志实现是开放的。可对接其他日志框架SpringBoot
默认实现是Logback
日志记录
- 方式 1:使用
Lombok
的@Slf4j
直接使用log.info
,log.debug.....
打印
@RestController
@Slf4j
public class HelloController {
Logger log = LoggerFactory.getLogger(Logger.class);
@GetMapping("/h")
public String hello(String a, String b){
//这里 a b 用来接收形参, 自动填充到 {} 中
log.info("niho a{}, b{}" , a, b);
return "hello";
}
}
- 方式2:使用
Logger log = LoggerFactory.getLogger(Logger.class)
日志工厂
@RestController
public class HelloController {
Logger log = LoggerFactory.getLogger(Logger.class);
@GetMapping("/h")
public String hello(String a, String b){
log.info("niho a{}, b{}" , a, b);
return "hello";
}
}
日志底层
- 每个
starter
场景,都会导入一个核心场景spring-boot-starter
- 核心场景引入了日志的所用功能
spring-boot-starter-logging
- 默认使用了
logback + slf4j
组合作为默认底层日志 xxxAutoConfiguration
是系统启动完了放好组件,后来用的。而日志是利用LoggingListener
监听器配置的- 所有的日志配置可以通过修改配置文件实现。
logging
开头就是日志相关配置
日志格式
默认格式
023-03-31T13:56:17.511+08:00 INFO 4944 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat
- 时间和日期:毫秒级精度
- 日志级别:
ERROR
,WARN
,INFO
,DEBUG
,TRACE
- 进程
ID
---
: 消息分割符- 线程名: 使用
[]
包含Logger
名: 通常是产生日志的类名- 消息: 日志记录的内容
修改日志格式
- 默认日志格式:参照
spring-boot
包下additional-spring-configuration-metadata.json
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
建议修改成
%d{yyyy-MM-dd HH:mm:ss.SSS}
表示日期和时间,精确到毫秒。[%thread]
表示输出当前线程名称。%-5level
表示日志级别,左对齐并占 5 个字符。%logger{36}
表示日志记录器名称,最大长度为 36 个字符。%msg
表示日志消息本身。%n
表示换行符。%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n
在 Application.properties
修改配置文件
#修改控制台日志输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n
#原格式只修改日期输出格式
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS
#修改日志记录文件格式
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} ===> %msg%n
日志级别
- 从高到底:只会打印该级别以及比它更严重级别的日志
ALL
:打印所有日志TRACE
:追踪框架详细流程日志,一般不使用DEBUG
:开发调试细节日志INFO
:关键、感兴趣信息日志WARN
:警告但不是错误的信息日志,比如:版本过时ERROR
:业务错误日志,比如出现各种异常FATAL
:致命错误日志,比如jvm系统崩溃OFF
:关闭所有日志记录注意:
- 不指定级别的所有类,都使用
root
指定的级别作为默认级别SpringBoot
日志默认级别是INFO
在 Application.properties
中配置日志记录级别
#默认所有日志没有精确指定级别就使用 root 默认级别
logging.level.root=info
#logging.level.包名
#精确调整某个包下日志级别
logging.level.com.atguigu.logging.controller=info
logging.level.com.atguigu.logging.service=info
日志分组
日志分组技巧
- 将相关的
logging
分组在一起,统一配置。SpringBoot
也支持。比如:Tomcat
相关的日志统一设置#logging.group.组名 = 包1,包2 logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat #配置这个组的级别 logging.level.tomcat=trace
SpringBoot 预定义的两个组
Name | Loggers |
---|---|
web | org.springframework.core.codec , org.springframework.http , org.springframework.web , org.springframework.boot.actuate.endpoint.web , org.springframework.boot.web.servlet.ServletContextInitializerBeans |
sql | org.springframework.jdbc.core , org.hibernate.SQL , org.jooq.tools.LoggerListener |
日志文件归档与滚动切割
归档:每天的日志单独存到一个文档中。
切割:比如每个文件10MB,超过大小切割成另外一个文件。
- 每天的日志应该独立分割出来存档。如果使用
logback(SpringBoot 默认整合)
,可以通过application.properties/yaml
文件指定日志滚动规则。- 如果是其他日志系统,需要自行配置(添加
log4j2.xml
或log4j2-spring.xml
… )
归档切割规则设置
配置项 | 描述 |
---|---|
logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz) |
logging.logback.rollingpolicy.clean-history-on-start | 应用启动时是否清除以前存档(默认值:false ) |
logging.logback.rollingpolicy.max-file-size | 存档前,每个日志文件的最大小(默认值:10MB)。超过就自动切割 |
logging.logback.rollingpolicy.total-size-cap | 日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件 |
logging.logback.rollingpolicy.max-history | 日志文件保存的最大天数(默认值:7). |
自定义日志配置
通常我们配置
application.properties
就够了。当然也可以自定义。自定义后我们就可以用自己的配置。会覆盖掉默认的配置
- 建议在日志配置中使用
-spring
变量(例如,logback-spring.xml
而不是logback.xml
)。否则 spring 可能无法完全控制日志初始化
日志系统 | 自定义 |
---|---|
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
切换日志组合
- 排除掉原本的
logging
引入新的日志实现
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
- 配置 xml 日志配置文件
log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
- 使用对应日志 Logger 实现类
@RestController
public class HelloController {
private static final Logger log = LoggerFactory.getLogger(org.apache.logging.log4j.core.Logger.class);
@GetMapping("/h")
public String hello(String a, String b){
log.info("niho a{}, b{}" , a, b);
return "hello";
}
}