公司名称 网站域名 关联/sq网站推广
springboot日志使用入门
★ 典型的Spring Boot日志依赖:
spring-boot-start.jar -- spring-boot-starter-logging.jar (Spring Boot的日志包)-- logback(core、classic)-- log4j-to-slf4j.jar-- jul-to-slf4j.jar
就是springboot的默认的日志依赖实现。创建项目的时候存在这个依赖里面。
★ Java领域的日志框架可分为:
▲ 门面类(抽象层):SLF4J、JCL(Apache commons logging)、JBoss Logging▲ 日志实现:Log4j、Log4j2、Logback、JUL(JDK内置的java.util.logging)推荐应用程序面向日志门面编程,以便底层可以在不同的日志实现之间自由切换。项目中的日志框架,通常是两个:日志门面(抽象)+ 日志实现
★ Spring Boot的日志设计
下面的日志实现就是基于 SLF4J+Logback
SLF4J+Logback:SLF4J是门面,Logback是实现
▲ Spring Boot日志采用如下组合:- SLF4J+Logback:SLF4J是门面,Logback是实现▲ 由于Spring Boot要整合大量其他框架,这些框架底层可能采用了各种不同的日志实现,因此Spring Boot需要将这些日志全部“路由”给SLF4J(把所有日志统一交给SLF4J来输出),以后开发者就只需要设置SLF4J的日志即可。因此还需要- log4j-to-slf4j.jar:它负责将Log4j日志路由到SLF4J。- jul-to-slf4j.jar:负责将JUL日志路由到SLF4J。【说明】:当你项目用了Spring Boot之后,Spring boot会负责将所有第三方框架日志都路由给SLF4J,开发者就只需要配置SLF4J日志,即可对所有的日志进行全盘控制。【注意】:将Spring Boot应用部署到服务器上,JUL生成的日志将不再路由到Spring Boot应用的日志。——由于应用服务器底层往往都使用JUL日志,由于应用服务器本身、及服务器上可能部署了其他应用的日志这些日志当然与我们Spring Boot应用无关,所以Spring Boot默认不会将这些日志路由到SLF4J上。【总结】 Spring Boot统一了Java领域的所有框架所可能用到的日志实现,并将这些日志全部“路由”给SLF4J来管理,因此开发者只要管理SLF4J日志,即可对项目中所有日志框架进行管理。
★ 使用日志:
(1)在程序中获取Logger对象(org.slf4j包下的),通过LoggerFactory。也可用Lombok的@Slf4j注解来获取。(2)在要输出日志的地方(相当于以前Systme.out.println)Logger的trace\debug\info\warn\error来输出不同级别的日志。
★ 日志级别
▲ 日志级别:TRACE < DEBUG < INFO < WARNING < ERROR▲ 当日志输出方法的级别高于或等于应用日志的设置级别时,该日志才会实际输出。Spring Boot应用默认的日志级别是INFO,因此它默认只输出info、warn、error方法输出的日志。
★ 设置日志级别:
设置日志的级别,可通过以下方式:
▲ 改变Spring Boot的核心日志级别
通过debug=true或trace=true等属性(通过配置文件、命令行参数、系统变量、OS环境变量等方式)改变整个Spring Boot核心的日志级别。
▲ 改变程序组件(包括所有各种框架)的核心日志级别
通过logging.level.<logger-name>=<level>属性(可通过配置文件、命令行参数、系统变量等方式)设置指定日志的日志级别。其中<logger-name>代表日志名,通常就是包名或全限定的类名,如果<logger-name>使用包名,那就意味着对该包下所有类统一设置日志级别。如果<logger-name>使用类名,那就意味着对该类设置日志级别。而level则可以是trace、debug、info、warn和error等级别。
【小技巧】实际项目开发时,尽量避免使用System.out.println来做输出,而应该用日志来做输出。
System.out.println 在输出的时候,每打印一行都是需要进行IO的,所以会很耗性能。
如果你在调试时用了大量的System.out.println来做输出,到了项目上线时必须要删除这些输出语法,否则会因为IO造成性能影响。但如果你用的日志(debug)来输出,项目上线时,只要将应用级别调高,这些日志输出就会被自动关闭,因此无需输出这些日志输出语句。▲ 互联网上常问如何控制日志输出Spring Boot让MyBatis输出它执行的SQL语句啊?非常简单:logging.level.<Mapper组件所在包>=debug组件可以理解是类Spring Boot看到Redis的详细执行过程?非常简单:logging.level.io.lettuce.core=debugSpring Boot整合Redis默认使用Lettuce依赖,而io.lettuce.core就是Lettuce组件核心API所在的包。Spring Boot看到MongoDB的详细执行过程?非常简单:logging.level.com.mongodb=debug上面com.mongodb就是MongoDB核心API所在的包。由此可见,通过Spring Boot可以让它输出任意框架的执行过程,只需要如下设置logging.leve.<框架核心API所在的包>=debug
代码示例:
1、先创建一个类,获取日志对象。
2、然后在application.yml配置类里面配置一些日志信息—改变Spring Boot的核心日志级别
通过debug=true或trace=true等属性(通过配置文件、命令行参数、系统变量、OS环境变量等方式)改变整个Spring Boot核心的日志级别。
如图:这里在配置文件里面设置核心日志级别为 trace = true,就是级别为 trace。
但是打印出来的还是只有 info、warn 和error,但是控制台的启动记录里面还是有trace的,如图
这个是改变项目程序组件的核心日志级别,设置特定包下所有类的日志级别,打印的时候就可以如图,把 trace 和 debug 都打印出来
这个是让controller包下面的所有类的日志级别设置为 trace
这个是让LogController这个类的日志级别设置为 trace
★ 日志输出到文件:
Spring Boot默认只将日志输出到控制台,不输出到文件,如果要将日志输出到文件,可为Spring Boot设置如下两个属性的其中之一:- logging.file.name:设置日志文件的文件名。- logging.file.path:设置日志文件的目录。使用默认的spring.log作为文件名。logging.file.path 这个有一个好处,就是当日志文件过大的时候,就会自动把日志文件分成多个文件。
代码示例:
- logging.file.path:设置日志文件的目录。使用默认的spring.log作为文件名。
这个就是生成在文件夹中的日志文件,跟控制台的打印出来的是一样的。
Logback设置
logging.logback.rollingpolicy.file-name-pattern: 设置对日志归档的文件名模板
logging.logback.rollingpolicy.clean-history-on-start:设置应用启动时是否清除日志归档
logging.logback.rollingpolicy.max-file-size日志文件归档之前的最大大小
logging.logback.rollingpolicy.total-size-cap:日志归档在被删除之前所能容纳的最大大小
logging.logback.rollingpolicy.max-history: 保留多少天的日志归档(默认为7)Java 的日志归档是指对生成的日志文件进行周期性或大小限制的管理,以便保留和存档旧的日志文件,以便后续的检查、分析和备份。
通常情况下,应用程序会生成大量的日志数据,这些日志文件会越来越大,占用系统存储空间。为了避免过多的日志文件影响系统性能和存储空间的占用,可以对日志进行归档管理。
具体来说,归档通常有以下几种方式:
基于时间的归档:按照一定的时间间隔(如每天、每周、每月)将日志文件进行归档,将旧的日志文件存档到特定的文件夹或压缩文件中,以便后续查阅。
基于大小的归档:当日志文件达到一定大小时,将当前的日志文件存档,然后重新创建一个新的日志文件,以确保日志文件的大小始终在一个可接受的范围内。
★ 日志组:
(1)将多个包定义一个组名,(2)然后对整个组设置指定的日志级别——这样即可将该组对应的所有包统一设置成相同的日志级别。日志组也是一个提高项目可维护性的小技巧。
就是一个项目有很多个包(文件夹),比如 controller,service、dao、domain、config 等等,然后我们想让controller、service、dao这三个包的日志级别设置为 debug 级别。但是又不可能在配置文件中一个包一个包的写配置,所以这个时候就可以用到日志组。
代码示例:
需求:我这个项目有三个包c1,c2,c3,我想让 c2 和 c3 这两个包的日志级别为 warn ,然后项目的其他包的日志级别为trace。
这里建3个包
我配置让 c2 c3这两个包的日志级别为warn
项目其他包的日志级别为 trace,其他包不可能一个一个写出来,所以直接把最大的包 boot 进行设置。
但是 c2 c3 这两个包又被包含在 boot 包里面,所以要看看c2 c3 这两个包的日志级别是我们要的 warn 级别,还是会因为被boot包 包含而变成trace级别
如图可以看出 c2 c3 这两个包的日志级别没有被 boot 包影响,还是我们要的warn级别。
而项目的其他包,如 c1 ,就是我们要的 trace 级别
这两个设置,谁放上面谁放下面都没有影响各自的日志级别,不会有那种放下面然后覆盖上面的情况。
上面的日志实现就是基于 SLF4J + Logback:SLF4J是门面,Logback是实现
▲ 门面类(抽象层):SLF4J、JCL(Apache commons logging)、JBoss Logging
▲ 日志实现:Log4j、Log4j2、Logback、JUL(JDK内置的java.util.logging)
★ 如何替换默认的日志实现(Logback)
▲ 两步:(1)去掉Logback依赖库,添加新日志实现的依赖库。Logback日志实现的优先级最高,当该日志实现的JAR存在时,Spring Boot总会使用该JAR包作为默认的日志实现。 (2)在类加载路径的根路径下为新日志实现提供对应的配置文件。默认从类加载路径的根路径下加载日志配置文件,也可通过logging.config属性来设置新的加载路径。除了可根据底层依赖库自动选择日志实现外——根据JAR包来自动选择日志实现,找到哪个日志实现的JAR包,Spring Boot就是用哪个日志实现。还可通过org.springframework.boot.logging.LoggingSystem属性显式指定日志实现,
该属性的值可以是LoggingSystem实现类的全限定名。▲ 不同日志实现的配置文件:Logback:logback-spring.xml、logback-spring.groovy、logback.xml或 logback.groovyLog4j2: log4j2-spring.xml或log4j2.xmlJDK(JUL):logging.propertiesSpring Boot 推荐 使用带-spring后缀的配置文件作为对应日志框架的配置文件。
★ 控制日志只输出到文件(不输出到控制台)
项目上线时比较实用!两步:(1)控制日志输出到文件。指定logging.file.name或logging.file.path两个属性的其中之一。(2)还需要显式提供日志实现对应的配置文件,通过该配置文件关闭日志在控制台的输出。——这一步的配置文件往往应该是日志实现相关的,和Spring Boot关系并不大。
代码示例
1、创建一个 logback-spring.xml 配置文件,这个配置文件专门用来控制 logback 日志的,现在在这个配置文件进行配置,让日志不要输出到控制台,只输出到指定的文件就行
application.yml 的配置不需要改,还是那样。
启动项目,然后再访问方法,发现控制台都没有任何的日志输出,一片空白,然后打开日志输出的文件,发现成功只输出在文件中
如图:项目的启动时间是16:36分,文件中的日志也是同个时间,证明日志只输出在指定文件中,没有输出在控制台
logback-spring.xml配置文件<!-- 关闭LogBack的日志在控制器的输出 -->
<configuration><!-- 导入Logback通用的日志配置 --><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!-- 定义日志文件 --><property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/><!-- 导入输入到文件的日志配置 --><include resource="org/springframework/boot/logging/logback/file-appender.xml"/><!-- 指定将日志输出到文件 ,只输出到文件,不输出到控制台 --><root level="INFO"><appender-ref ref="FILE"/></root>
</configuration>
上面用的是默认的 Logback,现在要改成 log4j2
★ 通过例子示范使用log4j2替换Logback
——比较小众的应用场景。用的比较少,因为 springboot 推荐用 SLF4J+Logback ,所以没必要改成其他的但是这里可以尝试一下。(1)去掉去掉Logback依赖库,添加Log4j2日志实现的依赖库。(2)添加log4j2日志的配置文件——这一步是可选的。
代码示例
在创建项目的时候,就会默认有logback的日志依赖了,所以把这个logback的日志依赖从pom.xml文件中去除就可以了。
1、这个操作就是把springboot默认的日志排除在外(就是把logback排除在外)
2、添加新的日志实现
启动项目,发现日志输出和之前没有什么区别,因为更改日志实现,是底层实现的,不是具体的代码实现,可以理解为抽象的,所以用 logback 或者是 log4j2 ,只是底层实现方法变了,但是呈现出来的效果还是一样的。
如果:因为把logback 改成 log4j2 ,所以原本设置的 日志记录只输出到文件,不输出到控制台的作用,也失效了。
要看logback 和 log4j2 的区别,只能从maven 里面看了
改回来 logback ,原本设置的 日志记录只输出到文件,不输出到控制台的效果 就又恢复了
相关文章:

23、springboot日志使用入门-- SLF4J+Logback 实现(springboot默认的日志实现),日志打印到控制台及日志输出到指定文件
springboot日志使用入门 ★ 典型的Spring Boot日志依赖: spring-boot-start.jar -- spring-boot-starter-logging.jar (Spring Boot的日志包)-- logback(core、classic)-- log4j-to-slf4j.jar-- jul-to-slf4j.jar就是springboo…...

【uniapp】 软键盘弹出后fixed定位被顶上去问题
问题描述 当手机设计的导航栏为fixed定位上去时,输入框获取焦点就会把顶部自定义的导航栏顶到上面去,如下图所示 解决办法 输入框设置 :adjust-position“false” <input type"text" :adjust-position"false" focus"i…...

HarmonyOS应用开发者基础认证考试题库
此博文为HarmonyOS应用开发者基础认证考试的最后的大考,要求100分取得90分方可获取证书、现将考试的题库进行分享,希望能帮到大家。但是需要注意的是,题库会不定时的进行题目删减,但是大概的内容是不会进行改变的。真心希望这篇博…...

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法
FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法 如下图所示,公司的一台机器人在正常工作时突然报警SRVO-105门打开或紧急停止,同时还有SRVO-067 OHAL2报警(G:1 A:2),按Reset键无法消除报警, 那么遇到这种情况,首先,我们来看一下报警说明书上的解释: 首先…...

在vue中Antv G2 折线图如何添加点击事件获取折线上点的值
在项目中有个需求是点击折线图的点,获取当前点的信息,其它图形都可以参考相关的API获取到,但area做的折线图怎么都获取不到点击的信息,只能获取全部的信息,最终解决如下: 实现思路 用户的鼠标在折线图上移…...

深度学习中训练、推理和验证分别都是什么意思
在深度学习中,推理(Inference)、训练(Training)和验证(Validation)是三个关键概念,它们分别表示了不同的阶段和任务: 训练(Training):…...

C语言规范
C语言规范 1.头文件 若包含了头文件aa.h,则就引入了新的依赖:一旦aa.h被修改,任何直接和间接包含aa.h代码都会被重新编译。如果aa.h又包含了其他头文件如bb.h,那么bb.h的任何改变都将导致所有包含了aa.h的代码被重新编译&#x…...

Express中间件
1.创建最基本的中间件 const express require(express); const send require(send);const app express()const mw function (req, res, next) {console.log(middleware);// 一定要调用next() 把流转关系交给下一个中间件或路由next() }app.listen(80, () > {console.l…...

124. 二叉树中的最大路径和
题目描述 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &…...

管理类联考——逻辑——论证逻辑——汇总篇——真题和典例——分析
分析 分析争论焦点题 199-2010-1-51——分析争论焦点题——论点争论模型 陈先生:未经许可侵入别人的电脑,就好像开偷来的汽车撞伤了人,这些都是犯罪行为。但后者性质更严重,因为它既侵占了有形财产,又造成了人身伤害…...

深度ip转换器:一键更换ip地址方法
很多网友问小编有关深度ip转换器怎么用?最新深度ip转换器手机版app?下面小编整理了深度ip转换器怎么修改ip地址的技巧和诀窍, 让我们来详细的了解一下深度id转换器, 一、深度ip转换器怎么用 1.深度ip转换器怎么用,深度…...

【TypeScript】类型断言-类型的声明和转换(五)
【TypeScript】类型断言-类型的声明和转换(五) 【TypeScript】类型断言-类型的声明和转换(五)一、简介二、断言形式2.1 尖括号语法2.2 as形式 三、断言类型3.1 非空断言3.2 肯定断言-肯定化保证赋值3.3 将任何类型断言为any3.4 调…...

行业追踪,2023-08-10
自动复盘 2023-08-10 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...

Nodejs下动态加载文件夹下的文件模块
个人博客 Nodejs下动态加载文件夹下的文件模块 个人博客,求关注,如果有不够清晰的,麻烦指出来,如果有很不正确的,多谢批评。 文章概叙 本文应用的场景是读取指定文件夹下面的所有文件,然后做操作&#…...

C#实现旋转图片验证码
开发环境:C#,VS2019,.NET Core 3.1,ASP.NET Core 1、建立一个验证码控制器 新建两个方法Create和Check,Create用于创建验证码(返回1张图片和令牌),Check用于验证(验证图…...

MySQL—缓存
目录标题 为什么要有Buffer Poolbuffer pool有多大buffer pool缓存什么 如何管理Buffer Pool如何管理空闲页如何管理脏页如何提高缓存命中率预读失效buffer pool污染 脏页什么时候会被刷入到磁盘 为什么要有Buffer Pool 虽然说MySQL的数据是存储在磁盘中,但是也不能…...

IP提取器对比器
需求: 一个html 页面 ,有两个输入框 第一个输入框输入文本中包含多个ip,输入的ip是不规则的,需要使用正则表达式提取出 输入文本的ip地址 , 然后在第二个输入框中输入内容,并提取出内容的ip ,如…...

【Spring Boot】构建RESTful服务 — RESTful简介
RESTful简介 本节将从基础的概念开始介绍什么是RESTful、RESTful的特点、RESTful中的资源、HTTP Method、HTTP Status,还将介绍RESTful和SOAP到底有哪些区别。 1.什么是RESTful RESTful是目前流行的互联网软件服务架构设计风格。REST(Representationa…...

模仿火星科技 基于cesium+水平面积测量+可编辑
当您进入Cesium的编辑水平积测量世界,下面是一个详细的操作过程,帮助您顺利使用这些功能: 1. 创建提示窗: 启动Cesium应用,地图场景将打开,欢迎您进入编辑模式。 在屏幕的一角,一个友好的提…...

26.配电网规划——考虑潮流约束的配电网规划
MATLAB代码直达:26.多时段-考虑潮流约束的配电网规划 clc;clear;close all; %% 导入数据 load(data.mat); MGpowerxlsread(MG1-3.xlsx); % 微电网的日负荷曲线 nt3 ; % 变压所个数 Sn25; % 变电所容量 MVA G…...

【云原生】K8S集群
目录 一、调度约束1.1 POT的创建过程1.1调度过程 二、指定节点调度2.1 通过标签选择节点 三、亲和性3.1requiredDuringSchedulingIgnoredDuringExecution:硬策略3.1 preferredDuringSchedulingIgnoredDuringExecution:软策略3.3Pod亲和性与反亲和性3.4使…...
python接口自动化之自动发送测试报告邮件
前言 SMTP(Simple Mail Transfer Protocol)也就是简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。python的smtplib模块就提供了一种很方便的途径发送电子邮件,它对smtp协议进行了简单的封装。 python发邮件主…...

umi出现“Cannot find module ‘umi-build-dev/lib/routes‘“ 错误
确认安装的 Umi 版本是否正确:首先,检查项目中 package.json 文件中的 umi 的版本号是否正确,确保版本号与项目所需的版本一致。清除缓存并重新安装依赖:可以尝试使用以下命令清除 npm 缓存并重新安装依赖: npm cache …...

Redis类型检查与命令多态
Redis中用于操作键的命令基本上可以分为两种类型。 其中一种命令可以对任何类型的键执行,比如说DEL命令、EXPIRE命令 、RENAME命令、TYPE命令、OBJECT命令等。 举个例子,以下代码就展示了使用DEL命令来删除三种不同类型的键: # 字符串键 redis> SE…...

mysql支持的xa具体指的是什么?
在MySQL中,XA指的是一种事务协议(eXtended Architecture),用于支持分布式事务。XA协议允许应用程序跨多个独立的数据库资源(例如多个MySQL实例)执行分布式事务。 具体来说,XA协议提供了以下关键…...

IntelliJ Idea 编译时控制台上中文输出乱码
猜测原因是IDEA启动时未指定编码信息,故与系统编码保持一致(windows中文系统默认为GBK编码),当以UTF-8编码进行编译在控制台会以GBK编码输出,从而导致乱码 解决方案 指定Idea启动时JVM的默认编码为UTF-8 Help -> Edit Custom Options P…...
锚框【目标检测】
生成多个锚框 假设输入图像高为h,宽为w,我们以图像每个像素为中心生成不同形状的锚框,缩放比 s∈(0,1],宽高比为r>0。那么锚框的宽度和高度分别为和。当中心位置给定时, 已知宽和高的锚框是确定的。缩放比为锚框高与图像高的比值,然后得到一个正方形锚框面积。 …...

001-Spring boot 启动内置Web容器分析
目录 代码入口上下文容器 加载web容器WebServercreateWebServergetWebServerFactory():getWebServer(): 执行WebServer#start自动配置读取配置修改配置 代码入口 上下文容器 SpringApplication.run(App.class); //追踪下去发现 context createApplicationContext…...

【Cocos Creator 项目实战 】消灭星星加强版(附带完整源码工程)
本文乃Siliphen原创,转载请注明出处 目录 概述 游戏整体流程 游戏框架设计 单一职责的类 主要流程控制类 核心玩法模块 UI: 游戏世界: 本文项目的代码组织结构 作者项目实践总结 场景只有一个入口脚本 尽量少在节点上挂载脚本 构…...

2023软件测试岗必问的100个面试题【含答案】
一、测试理论 1.什么是软件测试? 答:软件测试是通过执行预定的步骤和使用指定的数据,以确定软件系统在特定条件下是否满足预期的行为。 2.测试驱动开发(TDD)是什么? 答:测试驱动开发是一种开…...