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

spring boot actuator 动态修改日志级别

1 日志级别

Spring Boot Actuator包括在运行时查看和配置应用程序日志级别的功能。您可以查看整个列表,也可以查看单个记录器的配置,该配置由显式配置的日志级别和日志框架给出的有效日志级别组成。这些级别可以是:

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • OFF
  • null

null表示没有显式配置。

2 logger接口

2.1 列表

GET /loggers

样例:
GET http://localhost:8087/actuator/loggers
Authorization: Basic dGVzdDpCQUtGWCQzbA==

2.2 详情

GET /loggers/{name:.*}

样例:
GET http://localhost:8087/actuator/loggers/sample.actuator.SampleActuatorApplication
Authorization: Basic dGVzdDpCQUtGWCQzbA==

2.3 修改level

POST /loggers/{name:.*}

样例:
POST http://localhost:8087/actuator/loggers/sample.actuator.SampleActuatorApplication
Authorization: Basic dGVzdDpCQUtGWCQzbA==
Content-Type: application/json

{
“configuredLevel”: “DEBUG”
}

3 分析

接口位于spring boot actuator 的LoggersMvcEndpoint
LoggersMvcEndpoint->LoggersEndpoint->LoggingSystem

3.1 LoggingSystem

LoggingSystem是接口,通过实现类具体处理
在这里插入图片描述
LoggingSystem实现类是通过LoggingSystem.get(get(ClassLoader classLoader)获得的

    private static final Map<String, String> SYSTEMS;static {// LinkedHashMap 保证顺序性,logback、log4j、javalogging的顺序,加载到对应的类,就返回对应的LoggingSystem的实现类Map<String, String> systems = new LinkedHashMap<String, String>();systems.put("ch.qos.logback.core.Appender", "org.springframework.boot.logging.logback.LogbackLoggingSystem");systems.put("org.apache.logging.log4j.core.impl.Log4jContextFactory","org.springframework.boot.logging.log4j2.Log4J2LoggingSystem");systems.put("java.util.logging.LogManager", "org.springframework.boot.logging.java.JavaLoggingSystem");SYSTEMS = Collections.unmodifiableMap(systems);}public static LoggingSystem get(ClassLoader classLoader) {String loggingSystem = System.getProperty(SYSTEM_PROPERTY);if (StringUtils.hasLength(loggingSystem)) {if (NONE.equals(loggingSystem)) {return new NoOpLoggingSystem();}return get(classLoader, loggingSystem);}for (Map.Entry<String, String> entry : SYSTEMS.entrySet()) {if (ClassUtils.isPresent(entry.getKey(), classLoader)) {return get(classLoader, entry.getValue());}}throw new IllegalStateException("No suitable logging system located");}private static LoggingSystem get(ClassLoader classLoader, String loggingSystemClass) {try {Class<?> systemClass = ClassUtils.forName(loggingSystemClass, classLoader);return (LoggingSystem) systemClass.getConstructor(ClassLoader.class).newInstance(classLoader);}catch (Exception ex) {throw new IllegalStateException(ex);}}

LoggingSystem.get(get(ClassLoader classLoader)是通过LoggingApplicationListener调用的

3.2 LoggingApplicationListener

LoggingApplicationListener类图如下
在这里插入图片描述
在spring.factories发现LoggingApplicationListener配置,通过SpringFactoryLoader加载
在这里插入图片描述
初始化流程
在这里插入图片描述
注册到spring
在这里插入图片描述
调用流程
在这里插入图片描述

4 问题

4.1 安全

http接口可能会暴漏出去,存在安全问题。可以参照https://blog.csdn.net/weixin_43511928/article/details/129131251

  • 指定management.port,独立于业务端口
  • security.user.name、security.user.password配置账号密码(密码要使用强密码)

4.2 缺少reset

日志级别重置,恢复现场。

  • 可以在setLogLevel记录被修改的名字、旧的日志级别
  • 提供/logger/reset接口,setLogLevel恢复列表

4.3 只支持spring boot

4.3.1 参照对应日志框架LoggingSystem setLogLevel实现

LogbackLoggingSystem

	@Overridepublic void setLogLevel(String loggerName, LogLevel level) {ch.qos.logback.classic.Logger logger = getLogger(loggerName);if (logger != null) {logger.setLevel(LEVELS.convertSystemToNative(level));}}

Log4J2LoggingSystem

	@Overridepublic void setLogLevel(String loggerName, LogLevel logLevel) {Level level = LEVELS.convertSystemToNative(logLevel);LoggerConfig loggerConfig = getLoggerConfig(loggerName);if (loggerConfig == null) {loggerConfig = new LoggerConfig(loggerName, level, true);getLoggerContext().getConfiguration().addLogger(loggerName, loggerConfig);}else {loggerConfig.setLevel(level);}getLoggerContext().updateLoggers();}

4.3.2 使用arthas修改

参照 https://arthas.aliyun.com/doc/logger.html

相关文章:

spring boot actuator 动态修改日志级别

1 日志级别 Spring Boot Actuator包括在运行时查看和配置应用程序日志级别的功能。您可以查看整个列表&#xff0c;也可以查看单个记录器的配置&#xff0c;该配置由显式配置的日志级别和日志框架给出的有效日志级别组成。这些级别可以是: TRACEDEBUGINFOWARNERRORFATALOFFnu…...

兴达易控Modbus转Profinet网关连接1200Profinet转modbus接三菱A800变频器案例

下面介绍A800 变频器通过兴达易控modbus转profinet网关&#xff0c;使1200plc无需编程实现Profinet转modbus协议转换&#xff0c;把modbus变频器轻松组网 网络拓扑如下图 打开博图组态加载GSD文件&#xff0c;modbus转profinet网关从站接口接入到1200PLC上 配置modbus转profine…...

「SAP ABAP」OPEN SQL(四)【FROM语句】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…...

一文吃透 SpringMVC 中的转发和重定向

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Hbase操作命令

目录 创建表&#xff0c;表中有两个列族 baseinfo, schoolinfo 查看指定表全名空间中的表 查看表描述 禁用/启用 查看是否启用/禁用 删除表 注意&#xff0c;首先要将删除的表设置为禁用状态才可以删除&#xff0c;否则会报错 新增列族 删除列族 更改列族存储版本的限制 增…...

1>LINK : fatal error LNK1104: cannot open file ‘libconvtname.obj‘

我自己最后找到问题原因是&#xff1a; 引用的库名称没有.lib&#xff0c;只有libconvtname。 改成完整的libconvtname.lib即可。 以下是chatGPT的回答 The error message "fatal error LNK1104: cannot open file libconvtname.obj" usually occurs when Visual S…...

数据结构——链表OJ题目讲解(1)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月7日 内容&#xff1a;数据结构链表OJ题目讲解 题目来源&#xff1a;力扣和牛客 目录 前言&#xff1a; 刷题&#xff1a; 1.移出链表元素&#xff1a; 2.链表的中间结点&#xff1a; 3. 链表中倒数第k个结点&#xff1…...

LeetCode_二分搜索_困难_154.寻找旋转排序数组中的最小值 II

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4…...

面向对象设计模式:创建型模式之建造者模式

一、引入 Build&#xff1a;建造和构建具有建筑结构的大型物体 建楼&#xff1a;打牢地基、搭建框架、然后自下而上一层层盖起来。构建物体&#xff1a;通常需要先建造组成这个物体的各个部分&#xff0c;然后分阶段把它们组装起来 二、建造者模式 2.1 Intent 意图 Separate…...

集成学习boosting、bagging、stacking

目录 一、介绍 二、三种架构学习 &#xff08;1&#xff09;boosting &#xff08;2&#xff09;bagging &#xff08;3&#xff09;stacking 一、介绍&#xff1a; 对于单个模型来说很难拟合复杂的数&#xff0c;模型的抗干扰能力较低&#xff0c;所以我们希望可以集成多…...

数据模型(上):模型分类和模型组成

1.模型分类 ​ 数据模型是一种由符号、文本组成的集合,用以准确表达信息景观,达到有效交流、沟通的目的。数据建模者要求能与来自不同部门,具有不同技术背景,不同业务经验,不同技术水平的人员交流、沟通。数据建模者要了解每个人员的观点,并通过反馈证明理解无误,最终作…...

郑州轻工业大学2022-2023(2) 数据结构题目集 - ZZULI

6-1 线性表元素的区间删除 6-1 线性表元素的区间删除 分数 20 全屏浏览题目 切换布局 作者 DS课程组 单位 浙江大学 给定一个顺序存储的线性表&#xff0c;请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储&#xff0c;并且相对位置不能改变…...

【Python语言基础】——Python MySQL Drop Table

Python语言基础——Python MySQL Drop Table 文章目录Python语言基础——Python MySQL Drop Table一、Python MySQL Drop Table一、Python MySQL Drop Table 删除表 您可以使用 “DROP TABLE” 语句来删除已有的表&#xff1a; 实例 删除 “customers” 表&#xff1a; import…...

2023美团面试真题

面试前需要准备&#xff1a; 1. Java 八股文&#xff1a;了解常考的题型和回答思路&#xff1b; 2. 算法&#xff1a;刷 100-200 道题&#xff0c;记住刷题最重要的是要理解其思想&#xff0c;不要死记硬背&#xff0c;碰上原题很难&#xff0c;但 大多数的解题思路是相通的…...

【微信小程序开发全流程】篇章0:基于JavaScript开发的校园综合类微信小程序的概览

基于JavaScript开发的校园综合类微信小程序的概览 本文仅供学习&#xff0c;未经同意请勿转载 一些说明&#xff1a;上述项目来源于笔者我本科大三阶段2019年电子设计课程项目&#xff0c;在这个项目中&#xff0c;我主要是负责的部分有前端&#xff0c;前后端的对接&#xf…...

如何分析sql性能

1、前言 提到sql性能分析&#xff0c;可能都会想到explain&#xff0c;它在mysql里被称为执行计划&#xff0c;也就是说可以通过该命令看出mysql在通过优化器分析之后如何执行sql。mysql的内置优化器十分强大&#xff0c;它能帮我们把sql再次优化&#xff0c;以最低的成本去执…...

市场营销书籍推荐:《经理人参阅:市场营销》

要学好市场营销有什么好方法&#xff1f;答案是看书&#xff01;比起碎片化地去阅读一些文章或看一些相关视频&#xff0c;读书来得更实在些。倘若能静下心来好好读上一本系统性的市场营销书籍&#xff0c;学好营销管理将不会再是一件难事。然而&#xff0c;问题的关键是&#…...

WPF 控件专题 MediaElement控件详解

1、MediaElement 介绍 MediaElement&#xff1a;表示包含音频和/或视频的控件。 MediaOpened在引发事件之前&#xff0c;ActualWidth控件将ActualHeight报告为零&#xff0c;因为媒体内容用于确定控件的最终大小和位置。 对于仅音频内容&#xff0c;这些属性始终为零。 对于固…...

基于SpringBoot+SpringCloud+Vue前后端分离项目实战 --开篇

本文目录前言做项目的三大好处强强联手(天狗组合)专栏作者简介专栏的优势后端规划1. SpringBoot 和 SpringCloud 的选择2. Mybatis 和 MybatisPlus 和 JPA 的选择3. MySQL 和 Mongodb 的选择4. Redis 和 RocketMQ5. 后端规划小总结后端大纲提前掌握的知识点一期SpringBoot二期S…...

循环队列的实现

我们知道队列的实现可以用单链表和数组&#xff0c;但是循环链表也可以使用这两种方式。首先我们来看看单链表&#xff1a;首先使用单链表&#xff0c;我们需要考虑循环队列的一些特点。单链表实现循环队列我们要考虑几个核心问题&#xff1a;首先我们要区别 解决 空 和 满 的问…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...