Spring Boot 日志
目录
1.概述
2.切换日志实现
3.使用
3.1.日志级别
3.3.日志离线
3.4.详细定制
1.概述
由一些历史原因,JAVA领域存在有很多日志框架,如Log4j、Logback、log4j2。
log4j是Java日志框架的元老,在log4j被Apache Foundation收入门下之后,由于理念不合,log4j的作者Ceki离开并开发了slf4j和logback。这几个框架都很热门,这就造成了不同系统、不同开源框架使用的日志框架都不同。
因为不同日志框架的日志输出格式、API均不同,所以当系统中存在多种日志框架被混用就会出现冲突,最直接的现象就是——日志格式不统一,这对项目的日志排查来说是极不方便的,甚至有时候还会因为日志框架的冲突而报错。因此同一个项目中统一日志框架是十分有必要的,但是如果只是单纯的保留一个日志框架,移除其余日志框架,由于各日志系统API的不同很可能系统根本就起不来,所以需要一个中间层来进行适配,从而解决这个问题。
这个中间层就是——日志门面。日志门面使用门面模式屏蔽掉了不同日志实现之间的不同,对外暴露统一的API。

2.切换日志实现
SpringBoot默认使用SLF4J作为日志门面,LogBack作为日志实现来记录日志。
这里我们不去细究SLF4J是怎么去完成适配的,只需要知道SpringBoot自带了日志门面,使用日志门面来输出日志,当想要切换日志实现的时候,排掉LogBack,引入新的实现即可。
以切换为log4j2为例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--1. 排除掉依赖 ,以此排除掉logback+slf4j引用-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--2. 添加log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
3.使用
3.1.日志级别
配置:
可以指定全局日志等级,也可以以方法为粒度指定日志等级,支持*作为通配符
#全局日志等级 logging.level.root=trace #单都指定日志等级 logging.level.com.eryi.controller.MyRunner.*=trace
代码:
package com.eryi.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class MyRunner implements CommandLineRunner {//特别注意,要使用slf4j的Logger和LoggerFactoryLogger logger= LoggerFactory.getLogger(MyRunner.class);@Overridepublic void run(String... args) throws Exception {//日志级别:error<warn<info<debug<tracelogger.trace("trace......");logger.debug("debug......");//Spring Boot默认使用info级别logger.info("info......");logger.warn("warn......");logger.error("error......");}
}
3.3.日志离线
不指定路径,日志文件只会在控制台输出,不会离线为本地文件。
使用path可以指定路径,文件名默认使用springlog.log
使用file可以指定路径+文件名,不指定路径会默认离现在工程目录下。
file和path是两个冲突设置,如果同时配置,只有file会生效。

3.4.详细定制
spring boot的配置文件中的日志配置项只能进行粗粒度的配置,想对日志进行细粒度的定制需要在类路径下(一般是在resources下)编写xml配置文件。命名规则为XXX-spring.xml,XXX是日志框架的名称。
以下为一个logback-spring.xml的模板:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
configuration中有appender、logger、root三个节点
appender:表示的是定义了一种文件的输出格式 就有点类似于 变量进行了定义 但是没有来得及使用
logger:这个就表示的是我们定义了这个变量在哪一个局部能够使用
我们的日志原本是针对于整个工程的配置 但是你可以定义在哪一个包里面 使用什么日志输出格式 以及 输出到哪些地方
root:相当于定义的是整个项目 的日志输出级别 以及 输出日志到哪些地方
--><!--
定义了日志的输出 ConsoleAppender 这个类表示的是输出到控制台
-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--设置输出到控制台的编码和格式%d{yyyy-MM-dd-HH:mm:ss.SSS}:这个表示的是时间的引用
%level:当前输出的日志级别
[%thread]:表示当前是哪一个线程
%class:这个表示的是这个日志是在哪一个类中打印出来的
%line:这个表示的是打印这个日志是在这个类的 哪一行打印出来的
%msg:这个表示的是打印的消息是什么
%n:这个表示的是换行
-->
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS}------->%level--------->[%thread]-%class:%line----->%msg%n</pattern>
<!--设置了打印到控制台的编码-->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--
定义日志输出到文件的格式
name:是可以随便写的 FileAppender:输出到文件
-->
<appender name="file" class="ch.qos.logback.core.FileAppender"><!--这个表示的是日志文件输出的路径 这个默认表示的是输出到当前项目的根目录下 叫做file.log-->
<file>log/file.log</file>
<!--这个表示的是 每一次写日志的时候是在上一次的基础上进行追加-->
<append>true</append>
<encoder>
<!--定义了输出的格式-->
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!--
prudent=true:表示的是日志的写入是线程安全的、但是线程安全会降低效率 一般默认设置为false
-->
<prudent>false</prudent>
</appender><!--
RollingFileAppender:表示的是日志要滚动输出-->
<appender name="timeFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--
rollingPolicy滚动的策略
TimeBasedRollingPolicy:最常用的一个、根据时间进行滚动 当达到一定的时间的时候、就会自动开辟一个新的日志文件
FixedWindowRollingPolicy:根据固定窗口的算法重命名文件的滚动策略
TriggeringPolicy:根据当前活动文件的大小来来确定是否滚动
-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件的名字 引用了当前的日期-->
<fileNamePattern>log/logFile%d{yyyy-MM-dd}.log</fileNamePattern>
<!--生成这个日志文件 保留多少天-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!--编码的格式-->
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender><!--
RollingFileAppender:这个是滚动输出
FixedWindowRollingPolicy:根据活动窗口算法的大小来滚动输出-->
<appender name="fixedFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志的名字-->
<file>log/fixedFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>log/fixedFile%i.log.zip</fileNamePattern>
<!--最少生成一个日志文件-->
<minIndex>1</minIndex>
<!--最多生成3个日志文件-->
<maxIndex>3</maxIndex>
</rollingPolicy><!--根据文件的大小来设置滚动输出的-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!--日志文件的最大的大小-->
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<!--日志输出的格式-->
<encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--文件输出-->
<appender name="filter" class="ch.qos.logback.core.FileAppender">
<file>log/filter.log</file>
<append>true</append>
<!--
LevelFilter:的意思是添加了一个日志级别的过滤器
如果日志的级别等于配置的级别。那么则执行onMatch里面的配置
否则执行 onMismatch中的内容
-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!--
ACCEPT:当前的日志会立即被执行不经过其他的过滤器了
DENY:日志立即被抛弃、也不再经过其他的过滤器了
NEUTRAL:下一个过滤器将继续执行、如果是最后一个过滤器的话那么就会被执行
-->
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!--临界值过滤器:如果你输出的日志级别 是低于下面定义的这个级别的话那么 就会被过滤掉-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter><encoder>
<pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<prudent>false</prudent>
</appender><!--设置局部的 这个日志的输出级别 或者 是 在哪里输出日志-->
<!--测试的路径-->
<!-- <logger name="com.project.controller" level="trace" addtivity="false">
<appender-ref ref="stdout" />
<appender-ref ref="file" />
<appender-ref ref="timeFile" />
</logger>--><!--这个是给全局设置一个日志级别 所有的都适用
appender-ref :全局的日志我们要打印到哪些地方-->
<root level="error">
<!-- 打印到控制台-->
<appender-ref ref="stdout" />
<!-- 打印到file文件里-->
<appender-ref ref="file" />
<appender-ref ref="timeFile" />
<!--<appender-ref ref="fixedFile" />-->
<!--<appender-ref ref="filter" />-->
</root></configuration>
相关文章:
Spring Boot 日志
目录 1.概述 2.切换日志实现 3.使用 3.1.日志级别 3.3.日志离线 3.4.详细定制 1.概述 由一些历史原因,JAVA领域存在有很多日志框架,如Log4j、Logback、log4j2。 log4j是Java日志框架的元老,在log4j被Apache Foundation收入门下之后&a…...
好用的研发管理看板工具有哪些?10款主流看板管理软件盘点
10大企业看板工具软件:1.软件开发项目看板 PingCode;2.通用看板软件 Worktile;3.开源看板软件 Wekan;4.免费看板软件 Trello;5.个人和小团队的看板软件 Todoist ;6.开源免费看 Kanboard;7.面向个…...
【软考系统架构设计师】2022下案例分析历年真题
【软考系统架构设计师】2022下案例分析历年真题 【软考系统架构设计师】2022下案例分析历年真题【软考系统架构设计师】2022下案例分析历年真题2022下案例分析历年真题第一题(25分)2022下案例分析历年真题第二题(25分)2022下案例分…...
Java skill - @JsonAlias 和 @JsonProperty
Java skill - JsonAlias 和 JsonPropertyJava skill系列目录:JsonAlias 和 JsonProperty使用 JsonProperty 的麻烦场景:使用 JsonAlias 应对麻烦场景:Java skill系列目录: 【Java skill - 统计耗时用StopWatch】 【Java skill - …...
【实际开发18】- 静态 3
目录 1. 调试与评估 2. 单元测试的管理 1. 单元测试的文档 3. 系统集成的模式与方法 1. 集成测试前的准备 2. 集成测试的模式 3. 大棒集成方法 ( Big-bang Integration) 4. 自顶向下和自底向上集成方法 1. 自顶向下法 ( Top-down Integration ) 2. 自底向上法 ( Bott…...
【swagger2】开发api文档
文章目录一、swagger2 简介背景Open API ???swagger2的作用swagger2常用工具组件:二、Springfox三、springBoot使用swagger2(简单示例)四、Swagger-UI使用五、配置文件1、配置类:给docket上下文配置api描述信息2、配置类&#…...
Github 上如何提交 pull request
什么是复刻(forking)? 我们可以通过复刻操作将喜爱的仓库保存自己的Github账户中,以便独立地对其进行操作。 通过复刻,我们可以得到包含完整版本历史的目标仓库的实例,之后可以对复刻得到的仓库进行任意操作而不会影响…...
Redis面试知识
概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能…...
Spring面试重点(四)——Spring事务
Spring事务 事务的方式 spring中使用事务有两种方式,一种是编程式事务,一种是声明式事务。编程式事务推荐使用TransactionTemplate,实现TransactionCallback接口,需要编码实现;声明式事务只需要在函数增加注解Transa…...
♡ — MySQL 存储引擎
MySQL 存储引擎架构 MySQL 存储引擎采用的是插件式架构,支持多种存储引擎,我们甚至可以为不同的数据库设置不同的存储引擎以适应不同场景的需要;存储引擎是基于表的,而不是数据库。 MyISAM 和 InnoDB 的区别 MySQL 5.5 之前&am…...
大数据技术架构(组件)34——Spark:Spark SQL--Optimize
2.2.3、Optimize2.2.3.1、SQL3.3.1.1、RB1、Join选择在Hadoop中,MR使用DistributedCache来实现mapJoin。即将小文件存放到DistributedCache中,然后分发到各个Task上,并加载到内存中,类似于Map结构,然后借助于Mapper的迭…...
Zookeeper实现分布式锁
文章目录ZK节点类型watch监听机制Zookeeper实现分布式锁锁原理创建锁的过程释放锁的过程ZK锁的种类代码实现Zookeeper是一个开源的分布式协调服务,是一个典型的分布式数据一致性解决方案。 分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅,负载均…...
MFC 添加重新启动管理器支持
重启管理器是添加到 Visual Studio for Windows Vista 或更高版本操作系统的功能 如果发生意外关闭或重启,重新启动管理器将为你的应用程序添加支持。 重新启动管理器的行为取决于应用程序的类型。 如果你的应用程序是文档编辑器,则重新启动管理器让应用…...
一文带你深刻的进入Python,并且了解Python的优缺点
最近几年Python被吹的神乎其神,很多同学都不清楚Python到底能干什么?就盲目去学习Python,今天我就Python的应用领域来简单盘点一下,让想学习Python 的同学找对方向不迷茫。 2. Python 的特点 这里就谈谈自己的看法,首先 Python是…...
别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(4)
别具一格,独此一家,原创唯美浪漫情人节表白专辑 不一样的惊喜哦~!(html5,css3,svg)表白爱心代码(复制就可用)(4) 目录 款式四:时光的记忆款 1、拷贝完整源代码 2、更新时光盒所…...
编译原理—翻译方案、属性栈代码
系列文章戳这里👇 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…...
链表
一、从尾到头打印链表题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解题思路:使用栈作为中转,可以实现倒置打印classSolution { public:vector<int> printListFromTailToHead(ListNode* head){//使用栈完成中…...
CSS 样式优先级
CSS 样式优先级决定了最终呈现在浏览器中的样式是哪一组样式,在多组样式中有冲突时,最终呈现在浏览器中的样式是具有最高优先级的样式。 CSS 样式优先级顺序如下: 内联样式 > 内部样式 > 外部样式 !important > 内联样式 > ID…...
SpingMVC获取请求参数
通过ServletAPI获取请求参数将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。html<form th:action"{/param/servletAPI}" method"post">用户名:<input ty…...
微搭使用笔记(二)微搭低代码平台介绍及基础使用
概述 官网地址: 官网 官方文档: 官方文档 FAQ: FAQ 腾讯云微搭低代码是一个高性能的低代码开发平台,用户可通过拖拽式开发,可视化配置构建 PC Web、H5 和小程序应用。支持打通企业内部数据,轻松实现企业微信管理、工…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
