Spring Boot 使用Apollo动态调整日志级别
摘要:在Spring Boot 项目中,借助Apollo动态修改配置的能力,结合Logback修改日志级别打印执行的SQL脚本。
综述
在生产环境偶现测试环境未发现的SQL查询BUG,但由于线上关闭debug和trace级别日志导致缺少执行SQL、异常堆栈等日志信息,没有办法火速定位问题根源。面对这样的线上问题,通常的解决方案如下:
方案一:修改服务代码,将日志级别改成DEBUG并发版,排查完问题之后,将日志级别改回原日志级别,再上一次线,整个生命周期很长,而且需要修改代码。
方案二:在上线的时候设置日志级别为INFO,但是,不会打印执行的SQL语句,不满足诉求。
上述方案一不够优雅,而且发版是有严格流程的,不能随意发版。方案二满足不了需要打印SQL脚本的诉求。如果有一种方式,能够动态修改日志级别,在需要排查问题的时候改成DEBUG,不需要的时候就恢复INFO,岂不妙哉?有,请移步《Spring Boot + Apollo 动态修改日志级别》,本文讨论的核心是基于方案一的伪动态配置日志打印级别,但是,不需要改服务代码,只修改配置中心和重启服务。楼兰胡杨在《性能调优之日志打印的坑》中讨论了如何避免打印日志时常见的不优雅操作,感兴趣的猿友可以去了解一下。
解决方案
在 Spring Boot 中,日志的打印基于监听器机制实现。Spring Boot集成了配置中心Apollo和日志框架logback,所以,可以在Apollo设置输出到控制台的日志级别,然后重启服务即可生效,当然,如果是在线上环境配置的,请使用之后及时回滚配置。在Apollo中使用如下格式设置打印级别:
logging.level.file.path = logLevel
logging.level:用于设置日志级别,file.path为日志级别logLevel生效的作用域,可以是需要打印日志的包名,也可以是具体的类名。
logLevel:选项包括trace、debug、info、warn、error和fatal。debug级别日志用于记录一些关键操作的详细信息,通常在开发和测试阶段使用,本文用于线上环境调试应用程序,提供详细的执行信息,有助于发现问题。
在application.properties(.yml)或者Apollo中增加如下配置后,可以去控制台观察打印效果:
logging.level.com.huyang=error // com.huyang包下所有class以error级别输出日志
logging.level.com.huyang.querydao.WienerDao=debug //com.huyang.querydao包下的类WienerDao以debug级别输出执行的SQL语句
如果在application.properties中已经设置了,优先使用Apollo配置的日志级别。
关于logging.lever.root=info,其中 root 指把整个项目日志级别调整为error, 即可实现关闭绝大部分项目启动日志运行日志(近似关闭,亦可使用 off)。
logging.lever.com.xxx.querydao 其中com.xxx.querydao可为mapper文件对应的包,即可实现打印sql日志功能。
Spring Boot 使用Apollo动态调整日志级别的更多相关文章
- 动态调整日志级别思路&实现
引言 上篇文章 性能调优--小小的 log 大大的坑 已将详细的介绍了高并发下,不正确的使用日志姿势,可能会导致服务性能急剧下降问题.文末也给各位留下了解决方案--日志级别动态调整. 本文将详细介绍& ...
- Log4cpp配置文件及动态调整日志级别的方法
一.log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试: 可扩展的.多种方式记录日志,包括命令 ...
- Spring Boot 整合 Apollo
简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 ...
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...
- springboot动态修改日志级别+权限认证
1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...
- [C#] 将NLog输出到RichTextBox,并在运行时动态修改日志级别过滤
作者: zyl910 一.缘由 NLog是一个很好用的日志类库.利用它,可以很方便的将日志输出到 调试器.文件 等目标,还支持输出到窗体界面中的RichTextBox等目标. 而且它还支持在运行时修改 ...
- Spring Boot (16) logback和access日志
Spring Boot 内部采用的是Commons Logging进行日志记录,但是在底层为Java Util Logging.Log4J2.Logback等日志框架提供了默认配置. logback ...
- Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean
在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...
- log4j2动态修改日志级别及拓展性使用
一.供参考的完整日志配置 <?xml version="1.0" encoding="UTF-8"?> <!-- 配置LoggerConfig ...
- Spring Boot动态修改日志级别
1. pom中引入 org.springframework.boot spring-boot-starter-actuator 2. 发送POST请求: 地址: http://[服务地址] ...
随机推荐
- mysql : 第5章 数据库的安全性
-- 创建用户CREATE USER utest@localhost IDENTIFIED BY 'temp';-- 查看所有用户SELECT * FROM mysql.user;-- 查看表级权限S ...
- Selenium WebDriver上创建 WebDriver测试脚本
本文实现一个WebDriver测试脚本,介绍WebDrive的常用命令.UI元素定位的策略以及在脚本中的使用,还有Get命令. 你将学到: 脚本创建 代码走查 测试执行 定位Web元素 ...
- 『Plotly实战指南』--折线图绘制基础篇
在数据分析的世界中,折线图是一种不可或缺的可视化工具. 它能够清晰地展示数据随时间或其他变量的变化趋势,帮助我们快速发现数据中的模式.趋势和异常. 无论是金融市场分析.气象数据监测,还是业务增长趋势预 ...
- go map fatal error: concurrent map iteration and map write 读写锁与深度拷贝的坑
起因 从币安实时拉取交易对的数据,这里使用了 map,用于存放每个交易对的最新价格,由于 map 并不是并发安全的所以加了读写锁. 但系统有时候还是会发生 fatal error: concurren ...
- 【Python】PDF文档导出指定章节为TXT
PDF文档导出指定章节为TXT 需求 要导出3000多个pdf文档的特定章节内容为txt格式(pdf文字可复制). 解决 导出PDF 查了一下Python操作PDF文档的方法,主要是通过3个库,PyP ...
- 关于TFDMemtable的使用场景【1】提供快速查询
建立内存表非常easy.看代码: begin createZipTable; FillZipCodeData; end: procdure CreateZipCodeTable; var Defs, ...
- 如何开发 MCP 服务?保姆级教程!
最近这段时间有个 AI 相关的概念特别火,叫 MCP,全称模型上下文协议(Model Context Protocol).这是由 Anthropic 推出的一项开放标准,目标是为大型语言模型和 AI ...
- 🎀avif转png在线工具推荐
简介 本文为avif格式图片转png图片在线工具推荐 工具 https://convertio.co/zh/avif-png/ 使用 上传avif图片 选择转换的格式 点击转换 下载 结束
- 1779. 找到最近的有相同 X 或 Y 坐标的点
1779. 找到最近的有相同 X 或 Y 坐标的点 class Solution { public int nearestValidPoint(int x, int y, int[][] points ...
- HTTP表单请求
okHttp 发送表单请求 需要添加依赖 compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.9.0' import ...