SpringBoot日志配置

SpringBoot日志配置

规范:项目开发不应该编写System.out.println()的语句,而应该日志记录信息。

日志门面技术日志实现
JCL(Jakarta Commons Logging)Log4j、 JUL(java.util.logging)
SLF4j(Simple Logging Facade for Java)Log4j2、Logback
jboss-logging

简介

1、Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。
spring5及以后commons-logging被spring自动导入
2、支持jul, log4j2, logback。SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件。
3、logback是默认使用的
4、虽然日志框架很多,但我们可以使用SpringBoot的默认配置。

SpringBoot默认日志配置

1、每个starter场景,都会导入一个核心场景spring-boot-starter
2、核心场景引入了日志的所有功能spring-boot-starter-logging
3、默认使用了logback+slf4j组合作为默认底层日志。
4、日志是系统启动就要用,xxxAutoConfuration是系统启动好了以后放好的组件。
5、日志是通过监听器机制配置好的,ApplicationListener
6、日志所有的配置都可以通过修改配置文件实现。以logging开始的所有配置。

日志格式

在这里插入图片描述

默认输出格式

时间和日期:毫秒级精度

日志级别:ERROR、WARN、INFO、DEBUG、TRACE

进程ID

—:消息分割符

线程名:使用[]包含

Logger名:通常是产生日志的类别

消息:日志记录的内容

默认值可参照spring-bootadditional-spring-configuration-metadata.json文件。

在这里插入图片描述

注意:logback没有FATAL级别,对应的是ERROR,在控制台使用jps能够查看所有进程。

日志使用

方式一

@RestController
public class HelloController {Logger logger = LoggerFactory.getLogger(HelloController.class);//Logger logger = LoggerFactory.getLogger(getClass())@GetMapping("/hello")public String hello(){logger.info("test log");return "hello";}
}

在这里插入图片描述
在这里插入图片描述

方式二

@Slf4j
@RestController
public class HelloController {@GetMapping("/hello")public String hello(){log.info("need lombok dependency");return "hello";}
}

在这里插入图片描述

在这里插入图片描述

日志级别

由低到高:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
只会打印指定级别及以上级别的日志

日志级别含义
ALL打印所有日志
TRACE追踪框架详细流程日志,一般不使用
DEBUG开发调试细节日志
INFO关键、感兴趣信息日志
WARN警告但不是错误的信息日志,比如:版本过时
ERROR业务错误日志,比如出现各种异常
FATAL致命错误日志,比如JVM系统崩溃
OFF关闭所有日志记录

不指定级别的所有类,都使用root指定的级别作为默认级别,SpringBoot日志默认级别是INFO。

测试

@Slf4j
@RestController
public class HelloController {@GetMapping("/hello")public String hello(){log.trace("trace 日志.....");log.debug("debug 日志.....");log.info("info 日志.....");log.warn("warn 日志.....");log.error("error 日志.....");return "hello";}
}

在这里插入图片描述

由于SpringBoot默认的日志级别是INFO,所以只有INFO级别及更高级别的日志信息才会被输出到日志中,而TRACE、DEBUG级别的日志信息将被忽略。

日志配置

1、在application.properties/yml中配置logging.level.<logger-name>=<level>指定日志级别,logger-name可以是某一个类
2、level可取值范围:TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF,定义在LogLevel中
3、root的logger-nameroot,可以配置logging.level.root=warn,代表所有未指定日志级别都使用root的warn级别

日志输出参数

@Slf4j
@RestController
public class HelloController {@GetMapping("/hello")public String hello(String a, String b){log.info("info 日志.....参数a:{} b:{}",a, b);return "hello";}
}

在这里插入图片描述

日志分组

将相关的logger分组在一起,统一配置。如:Tomcat相关的日志统一设置。

在这里插入图片描述

SpringBoot预定义两个开箱即用的组

nameLoggers
weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.web.servlet.ServletContextInitializerBeans
sqlorg.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

文件输出

SpringBoot默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.nameorlogging.path配置项。

logging.file.namelogging.file.path示例效果
未指定未指定仅控制台输出
指定未指定my.log写入指定文件。可以加路径
未指定指定/var/log写入指定目录,文件名为spring.log
指定指定logging.file.name为准
#指定日志文件的路径,日志文件默认名叫spring.log
#logging.file.path=
#指定日志文件的名称
#1、只写名字、就生成当前项目相同位置的demo.log
#logging.file.name=demo.log
#2、写名字+路径:生成到指定位置的指定文件
logging.file.name=D://demo.log

当path配置项和name配置项同时存在的时候,以name为准。

文件归档与滚动切割

归档:每天的日志单独存到一个文档
切割:每个文件10MB,超过大小切割成另外一个文件。

1、每天的日志因该独立分割出来存档。如果使用logback(SpringBoot默认整合),可以通过application.properties/yml文件指定日志滚动规则。
2、如果是其他日志系统,需要自行配置(添加log4j2.xml或log4j2-spring.xml)
3、支持的滚动规则设置如下

配置项描述
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)
logging.logback.rollingpolicy.file-name-pattern=$(LOG_FILE).%d(yyyy-MM-dd).%i.gz)

自定义配置

通常我们配置application.properties就够平常使用,当然也可以自定义。如:

日志系统自定义
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j2log4j2-spring.xml,log4j2.xml
JDK(Java Util Logging)logging.properties

建议在日志配置文件中使用-spring变量,而不是xxx.xml,如果不加-springspring不能完全控制。

切换日志组合

使用maven的就近原则。

<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>

最佳应用场景

1、导入热更新(Hot Reload)和第三方框架后,由于Spring Boot底层已经管理好了日志,因此需要排除这些框架的日志包。
2、修改application.properties配置文件,调整日志的所有行为。如果不够,可以编写日志框架,自己的配置文件放在类路径下就行,比如logback-spring.xml, log4j2-spring.xml
3、如果需要对接专业日志系统,只需要把logback记录的日志灌倒kafka中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可
4、业务中使用slf4j-api记录日志。不再需要System.out.pritln()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/106234.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《存储IO路径》专题:块设备层多队列blk-mq架构

我们想象一下&#xff0c;你是一个餐厅的厨师&#xff0c;你要准备很多不同的菜肴&#xff0c;而每种菜肴需要不同的食材和烹饪时间。如果每道菜都按照需要的顺序来准备&#xff0c;那么你的工作效率一定会非常低。为了提高效率&#xff0c;你会怎么做呢&#xff1f; 在linux架…

【Web】vue开发环境搭建教程(详细)

系列文章 C#底层库–记录日志帮助类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、安装准备1.1 node.js1.2 国内镜像站1.3 Vue脚手架1.4 element ui1.5 Visual Studio Code 二、安装步骤2.1 下载msi安装包2.2 …

FGO:使用chaIdea获取抽卡数据(mitmproxy抓包)

需求描述 最近逛贴吧看到好多master贴出自己的抽卡概率截图&#xff0c;本非洲杂鱼master也对自己的脸黑程度产生了好奇&#xff08;曾经15单芭娜娜池子1五星&#xff0c;6单道满池子1五星&#xff0c;梅莉池子330抽1五星&#xff0c;最近的芭娜娜复刻又330抽1五星&#xff09…

八种十倍提升API性能的方式

提起API&#xff0c;作为程序员来说并不陌生&#xff0c;很多程序员的大部分工作都是围绕着它&#xff0c; 然而&#xff0c;有些内容被大家忽略&#xff0c;API的性能会直接影响产品的用户体验&#xff0c;比如&#xff0c;一个视频软件&#xff0c;播放1s后需要加载5s&#x…

Java学习笔记------抽象类和抽象方法

抽象方法 抽象方法&#xff1a;将共性的行为&#xff08;方法&#xff09;抽取到父类之后&#xff0c;由于每一个子类执行的内容是不一样的&#xff0c;所以&#xff0c;在父类中不能确定具体的方法体&#xff0c;该方法就可以定义为抽象方法抽象类&#xff1a;如果一个类中存…

uniapp项目实践总结(十三)封装文件操作方法

导语&#xff1a;在日常 APP 开发过程中&#xff0c;经常要进行文件的保存、读取列表以及查看和删除文件等操作&#xff0c;接下来就看一下具体的方法。 目录 原理分析方法实现实战演练案例展示 原理分析 主要是以下 API。 uni.saveFile&#xff1a;保存文件到本地缓存列表…

【LeetCode-中等题】39. 组合总和

文章目录 题目方法一&#xff1a;递归回溯 题目 这题的nums数组里面不存在重复元素&#xff0c;所以也就无需做去重操作 但同一个元素可以被无限次取&#xff0c;说明每次递归中的for循环的开始位置就是自己 nums数组里面存在重复元素&#xff0c;去重版本&#xff1a; 方法一…

Linux学习之基础工具一

1.Linux 软件包管理器 yum 首先我们需要知道的是在Linux下&#xff0c;现存的软件和指令是一定的&#xff0c;而有的时候我们想需要更多的指令或者软件&#xff0c;而这在Linux本身下是没有的&#xff0c;故我们可以利用指令yum指令安装或卸载你想要或者不需要的软件&#xff…

angular中多层嵌套结构的表单如何处理回显问题

最近在处理angular表单时&#xff0c;有一个4层结构的表单。而且很多元素时动态生成&#xff0c;如下&#xff1a; this.validateFormthis.fb.group({storeId: ["test12"],storeNameKey:[],config:this.fb.group({ tableSize:this.fb.group({toggle:[false],groupSiz…

第69步 时间序列建模实战:ARIMA建模(R)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用R进行SARIMA模型的构建。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Re…

【设计模式】二、UML 类图概述

文章目录 常见含义含义依赖关系&#xff08;Dependence&#xff09;泛化关系&#xff08;Generalization&#xff09;实现关系&#xff08;Implementation&#xff09;关联关系&#xff08;Association&#xff09;聚合关系&#xff08;Aggregation&#xff09;组合关系&#x…

SpringBoot原理-自动配置-原理分析-源码跟踪

自动配置原理 SpringBootApplication 该注解标识在SpringBoot项目的启动类上&#xff0c;是SpringBoot中最为重要的注解&#xff0c;该注解由三个部分组成。 SpringBootConfiguration&#xff1a;该注解与Configuration注解作用一样&#xff0c;用来声明当前类为一个配置类Comp…