当前位置: 首页 > article >正文

SpringBoot 日志与配置文件

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.infolog.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 预定义的两个组

NameLoggers
weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
sqlorg.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

日志文件归档与滚动切割


归档:每天的日志单独存到一个文档中。

切割:比如每个文件10MB,超过大小切割成另外一个文件。

  • 每天的日志应该独立分割出来存档。如果使用 logback(SpringBoot 默认整合),可以通过 application.properties/yaml 文件指定日志滚动规则。
  • 如果是其他日志系统,需要自行配置(添加 log4j2.xmllog4j2-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 可能无法完全控制日志初始化
日志系统自定义
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2log4j2-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";
    }
}

http://www.kler.cn/a/525847.html

相关文章:

  • 智能家居环境监测系统设计(论文+源码)
  • 【Pandas】pandas Series cumprod
  • mysql重学(一)mysql语句执行流程
  • 【AI论文】Transformer^2: 自适应大语言模型
  • 数据库备份、主从、集群等配置
  • 【信息系统项目管理师-选择真题】2009上半年综合知识答案和详解
  • 【游戏设计原理】94 - 解决问题的方法
  • 赚钱的究极认识
  • INCOSE需求编写指南-附录 D: 交叉引用矩阵
  • Vscode编辑器下 Markdown无法显示图片
  • Docker小游戏 | 使用Docker部署RPG网页小游戏
  • mysql_init和mysql_real_connect的形象化认识
  • OSPF邻接关系无法建立之MTU问题
  • Day30-【AI思考】-错题分类进阶体系——12维错误定位模型
  • 前馈神经网络——最基本的神经网络架构
  • 【Leetcode 每日一题】350. 两个数组的交集 II
  • 昆虫机器人:从仿生设计到未来应用
  • SpringBoot Web开发(SpringMVC)
  • CF EDU ROUND 172
  • unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等