SpringBoot的日志系统(日志分组、文件输出、滚动归档)
@[toc](目录)
> SpringBoot3需要jdk17
# 1. 简介
1. Spring5及以后Spring自己实现了commons-logging,来作为内部的日志。日志的jar包是org.springframework:spring-jcl:6.0.10。查看org.apache.commons.logging.LogAdapter
```Java
package org.apache.commons.logging;
......省略部分......
final class LogAdapter {
private static final boolean log4jSpiPresent = isPresent("org.apache.logging.log4j.spi.ExtendedLogger");
private static final boolean log4jSlf4jProviderPresent = isPresent("org.apache.logging.slf4j.SLF4JProvider");
private static final boolean slf4jSpiPresent = isPresent("org.slf4j.spi.LocationAwareLogger");
private static final boolean slf4jApiPresent = isPresent("org.slf4j.Logger");
private static final Function<String, Log> createLog;
......省略部分......
```
只要导入了哪些日志包,就会使用哪些日志实现框架。所以底层的日志是开放的,可对接其他日志框架
2. 支持 jul、log4j2、logback(默认)日志实现。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件
# 2. SpringBoot日志默认配置流程
1、每个starter场景,都会导入一个核心场景spring-boot-starter
2、核心场景引入了日志的所用功能spring-boot-starter-logging
3、spring-boot-starter-logging默认使用了logback + slf4j 组合作为默认底层日志
4、日志是系统一启动就要用,xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的
5、查看autoconfiguration的logging目录,可以看到日志是利用监听器机制配置好的
6、日志所有的配置都可以通过修改配置文件实现。是以logging开始的所有配置
# 3. 默认日志格式
```
......省略部分......
2023-07-13T05:06:01.866+08:00 INFO 3096 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-07-13T05:06:01.881+08:00 INFO 3096 --- [ main] c.h.s.SpringBoot3TestApplication : Started SpringBoot3TestApplication in 3.383 seconds (process running for 4.406)
```
默认输出格式:
- 时间和日期:毫秒级精度
- 日志级别:ERROR、WARN、INFO、DEBUG
- 进程ID
- ---: 消息分割符
- 线程名: 使用[]包含
- Logger名: 通常是产生日志的类名
- 消息:日志记录的内容
默认值:参照:org.springframework.boot:spring-boot:3.1.1的META-INF的additional-spring-configuration-metadata.json文件
```
{
"name": "logging.pattern.console",
"type": "java.lang.String",
"description": "Appender pattern for output to the console. Supported only with the default Logback setup.",
"sourceType": "org.springframework.boot.context.logging.LoggingApplicationListener",
"defaultValue": "%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}"
}
```
修改默认值如下:
```
# 显示示例: 2023-07-13 05:16:09.952 INFO [main] c.h.s.SpringBoot3TestApplication ===> Started SpringBoot3TestApplication in 2.305 seconds (process running for 3.107)
# 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
```
# 4. 在类中记录日志
```Java
package com.hh.springboot3test.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class ControllerTest {
// Logger log = LoggerFactory.getLogger(getClass());
@GetMapping("/hello")
public String hello() {
// 2023-07-13 05:24:15.659 INFO 10212 --- [nio-8080-exec-2] c.h.s.controller.ControllerTest : 进入hello方法了
log.info("进入hello方法了");
return "hello";
}
}
```
# 5. 日志级别
由低到高:ALL、TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF
- ALL:打印所有日志
- TRACE:追踪框架详细流程日志,一般不使用
- DEBUG:开发调试细节日志
- INFO:关键、感兴趣信息日志
- WARN:警告但不是错误的信息日志,比如:版本过时
- ERROR:业务错误日志,比如出现各种异常
- FATAL:致命错误日志,比如jvm系统崩溃
- OFF:关闭所有日志记录
定义在org.springframework.boot:spring-boot:3.1.1的org.springframework.boot.logging.LogLevel枚举类
application.properties文件配置日志级别
```
# 默认日志级别设置
# logging.level.root=info
# 设置一个包或类的日志级别
logging.level.com.hh.springboot3test.controller.ControllerTest=debug
```
# 6. 日志分组
将相关的logger分组在一起,统一配置。application.properties配置如下:
```
# 多个值用逗号分隔
logging.group.my-logging-group=com.hh.springboot3test.controller.ControllerTest
logging.level.my-logging-group=warn
```
SpringBoot预定义两个组
- 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
# 7. 文件输出
SpringBoot默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name或logging.file.path配置项
logging.file.name | logging.file.path | 示例 | 效果
------ | ------ | ------ | ------
未指定 | 未指定 | | 仅控制台输出
指定 | 未指定 | D:\\my.log | 写入指定文件。可以加路径,默认路径是项目根路径
未指定 | 指定 | D:\\ | 写入指定目录,文件名为spring.log
指定 | 指定 | | logging.file.path无效,以logging.file.name为准
# 8. 文件归档与滚动切割
> 生产环境可以配置按日志级别分类,进行文件归档和滚动切割
归档:每天的日志单独存到一个文档中
切割:每个文件10MB,超过大小切割成另外一个文件
1. 每天的日志应该独立分割出来存档。如果使用logback(SpringBoot默认整合),可以通过application.properties/yaml文件指定日志滚动规则
2. 如果是其他日志系统,需要自己在日志配置文件中进行配置(添加log4j2.xml或log4j2-spring.xml)
3. 默认支持的滚动规则设置如下:
配置项 | 描述
------ | ------
logging.logback.rollingpolicy.file-name-pattern | 日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)。需要开启日志文件输出。`LOG_FILE`就是日志输出的路径和名称
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)
# 9. 自定义配置
日志系统 | 自定义
------ | ------
Logback| logback-spring.xml、logback-spring.groovy、logback.xml、logback.groovy
Log4j2 | log4j2-spring.xml、log4j2.xml
JDK (Java Util Logging) | logging.properties
建议在日志配置文件中使用-spring变量(例如使用logback-spring.xml而不是logback.xml)。如果您使用标准配置文件,日志初始化时的日志spring不能获取
比如可以使用logback-spring.xml文件进行配置。会和SpringBoot的logback配置混合起作用
# 10. 切换使用log4j2
直接在pom.xml添加依赖就可以了。但是不能使用文件归档与滚动切割,需要在log4j2.xml中自己配置
```
<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>
```
也可以使用log4j2-spring.xml文件进行配置。会和SpringBoot的log4j2配置混合起作用
# 11 实践
1. 导入任何第三方框架,先排除它的日志包,因为SpringBoot底层控制好了日志
2. 修改application.properties配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在资源路径下就行,比如logback-spring.xml,log4j2-spring.xml
3. 如需对接专业日志系统,如把logback记录的日志灌倒kafka之类的中间件,这和SpringBoot没关系,都是日志框架自己的配置,修改配置文件即可
相关文章:
SpringBoot的日志系统(日志分组、文件输出、滚动归档)
[toc](目录) > SpringBoot3需要jdk17 # 1. 简介 1. Spring5及以后Spring自己实现了commons-logging,来作为内部的日志。日志的jar包是org.springframework:spring-jcl:6.0.10。查看org.apache.commons.logging.LogAdapter Java package org.apache.commons.log…...

一种基于HTTPS实现的Web账号登录Linux桌面系统的实现方案
问题由来 客户需求计划列入支持第三方帐号系统,包括Web账号。需求来源是用户想要用它们的帐号直接登录Linux Deepin操作系统。一个失败的实现方案是用户以较小的成本改造帐号管理系统发布HTTP服务,我们开发一个PAM模块与Web服务器交互,数据格…...
【Linux】psplash制作Linux开机动画
1. 下载psplash软件 下载psplash源码到ubuntu中: 下载地址:https://git.yoctoproject.org/psplash/commit/安装依赖环境 sudo apt-get install libgdk-pixbuf2.0-dev2. 准备图片 开机动画静态图片:psplash-poky.png开机动画进度条图片&…...

WMS透明仓库:实现仓储的全方位可视化与优化
一、WMS透明仓库的定义与特点 1. WMS透明仓库的定义:WMS透明仓库是一种基于信息技术的仓库管理系统,通过实时数据采集、分析和可视化,将仓库内外的物流流程、库存状态、人员活动等信息以透明的方式展示给相关利益方。 2. 实时数据采集&…...

软考系统架构师知识点集锦一:系统工程与信息系统基础
一、考情分析 二、考点精讲 2.1 软件开发方法 (1)结构化开发方法 用户至上,自顶向下,逐步分解(求解),严格区分工作阶段,每阶段有任务与成果,强调系统开发过程的整体性和全局性,系统开发过程工…...

建筑模板常见的问题有哪些?
在建筑模板的使用过程中,常见的问题包括以下几个方面:1. 模板质量问题: - 模板破损或变形:模板可能在运输、安装或使用过程中受到损坏,如裂缝、断裂或变形。这可能导致模板的稳定性和承载能力下降。 - 模板尺寸不准确&…...

windows11录屏功能详解,记录你的精彩时刻
windows 11是微软最新推出的操作系统版本,拥有很多简单便捷的功能,包括内置的录屏工具,让用户可以轻松地录制屏幕内容。但是很多人不了解windows11录屏功能,本文将详细介绍windows 11录屏的三个方法,以及它们的优势和适…...
重入漏洞Victim
重入漏洞 顾名思义,重入漏洞可以简单理解为“重新进入的漏洞”。举个简单的例子,你往某个合约里存入了1个Ether,然后点击退款,按理来说只能退一个Ether,但是可以利用重入漏洞反复退款,把合约里的Ether掏空…...

wordpress数据库迁移Invalid default value for ‘comment_date‘
问题说明 最近在往新的电脑上迁移一个wordpress网站,在往新电脑上的mysql数据库中导入数据时,报错:1067 - Invalid default value for comment_date。 异常分析 这个错误的字面意思就是字段‘comment_date’的默认值是无效的,于…...

Xray联动RAD实现自动扫描教程
Rad下载地址:https://github.com/chaitin/rad xray下载地址:https://github.com/chaitin/xray Xray启动监听: xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output xray-xxx.html RAD启动爬虫抓包: rad_win…...
ES6 Proxy
定义: Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表…...
LSKA(大可分离核注意力):重新思考CNN大核注意力设计
文章目录 摘要1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论摘要 https://arxiv.org/pdf/2309.01439.pdf 大型可分离核注意力(LSKA)模块的视觉注意力网络(VAN)已被证明在各种基于视觉的任务上提供了卓越的性…...

muduo源码学习base——Exception(带 stack trace 的异常基类)
Exception(带 stack trace 的异常基类) 前置ExceptionCurrentThread::stackTrace() 前置 ABI: Application Binary Interface,应用程序二进制接口,可以参考:细谈ABI RTTI type_info: RTTI:Run Time Type Identificatio…...
2023-10-24 小总结
起始 不知不觉,作为职业码农,已经过去了4年。第4个1024了。 期间和Java、C#、JavaScript都打过交道。他们都很优秀。自然,好刀要在强者手中才能熠熠生辉。 快30了,回首过去,很感慨。发生了很多事,很多我都…...

2-MySQL的基本操作记录
1 数据库相关 -- --------------------表相关的---------- -- 查看字符集 show variables like %character%;show databases;# 创建数据库 create database test2;# 删除数据库 drop database test2; show databases;#查看当前使用的数据库 select database(); 2 用户相关 -…...

网站页脚展示备案号并在新标签页中打开超链接
备案时,我们就注意到,备案成功后需要在网站首页底部展示“备案号”,并将备案号链接至https://beian.miit.gov.cn。 这里我使用了WrodPress中的主题,主题自定义中有提供对页脚文本的编辑,支持用css标签定义样式。若是自…...

CentOS7 安装 nodejs
获取安装文件 node历史版本地址 安装 上传到服务器安装位置cd 到压缩包位置,执行解压安装操作 [rootps-fdcnops-01 /]# cd usr/local/nodejs/ [rootps-fdcnops-01 nodejs]# tar -xzvf node-v16.16.0-linux-x64 配置环境变量 [rootps-fdcnops-01 nodejs]# vim /…...

工程化测试:Apollo的单元测试与集成测试指南
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
DevOps 笔记
01 总论 "DevOps"是一个术语,它是“Development(开发)”和“Operations(运维)”两个单词的组合。这个概念是为了强调并促进开发人员(构建产品)和IT运营团队(负责产品部署和管理)之间的沟通、协作与整合。通过DevOps,组织力求快速、高效地开发高质量软件,…...

基于食肉植物优化的BP神经网络(分类应用) - 附代码
基于食肉植物优化的BP神经网络(分类应用) - 附代码 文章目录 基于食肉植物优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.食肉植物优化BP神经网络3.1 BP神经网络参数设置3.2 食肉植物算法应用 4.测试结果…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...