摘要:在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动态调整日志级别的更多相关文章

  1. 动态调整日志级别思路&实现

    引言 上篇文章 性能调优--小小的 log 大大的坑 已将详细的介绍了高并发下,不正确的使用日志姿势,可能会导致服务性能急剧下降问题.文末也给各位留下了解决方案--日志级别动态调整. 本文将详细介绍& ...

  2. Log4cpp配置文件及动态调整日志级别的方法

    一.log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试: 可扩展的.多种方式记录日志,包括命令 ...

  3. Spring Boot 整合 Apollo

    简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 ...

  4. SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot整合Restful架构 2.背景 Spring 与 Restful 整合才是微架构的核心,虽然在整 ...

  5. springboot动态修改日志级别+权限认证

    1. springboot动态修改日志级别+权限认证 1.1. 需求 网上找到的动态修改日志级别的方式,基本都是没有权限验证的,或者特地关闭权限验证,但也没给出加上验证的解决方式 修改日志等级也是一个 ...

  6. [C#] 将NLog输出到RichTextBox,并在运行时动态修改日志级别过滤

    作者: zyl910 一.缘由 NLog是一个很好用的日志类库.利用它,可以很方便的将日志输出到 调试器.文件 等目标,还支持输出到窗体界面中的RichTextBox等目标. 而且它还支持在运行时修改 ...

  7. Spring Boot (16) logback和access日志

    Spring Boot 内部采用的是Commons Logging进行日志记录,但是在底层为Java Util Logging.Log4J2.Logback等日志框架提供了默认配置. logback ...

  8. Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...

  9. log4j2动态修改日志级别及拓展性使用

    一.供参考的完整日志配置 <?xml version="1.0" encoding="UTF-8"?> <!-- 配置LoggerConfig ...

  10. Spring Boot动态修改日志级别

    1. pom中引入 org.springframework.boot       spring-boot-starter-actuator 2. 发送POST请求: 地址: http://[服务地址] ...

随机推荐

  1. 【论文随笔】深度推荐系统的自动化_一项调查(Automl for deep recommender systems_ A survey)

    前言 今天读的论文为一篇于2021年1月发表在ACM Transactions on Information Systems的论文,本文是一篇关于深度推荐系统自动化机器学习(AutoML)的综述,由R ...

  2. 【由技及道】螺蛳壳里做道场-git仓库篇-gitlab-Vs-gitea【人工智障AI2077的开发日志001】

    指令接收:「开始构建代码宇宙」 系统检测:需求模糊度99.9% 启动应急协议:构建最小可行性生态圈 核心组件锁定:代码基因库(人类称之为Git仓库) 需求分析:论人类语言的艺术性 人类指令翻译机 表面 ...

  3. buuctf-web 解题过程

    [SUCTF 2019]Upload Labs 2 源码 // admin.php <?php include 'config.php'; class Ad{ public $cmd; publ ...

  4. kubelet.service: Failed with result 'exit-code'.

    检查​​kubelet​​服务状态 systemctl status kubelet 检查journal日志 ​​journalctl​​​ 的 ​​-u​​​ 参数可以指定服务进行过滤,这样可以屏蔽 ...

  5. php session存进去,取不出来

    目录 一.检查 php.ini 二.查看 /var/tmp 是否有读写权限 ,如果没有: 三.检查 php-fpm 配置文件 四.重启 php-fpm 一.检查 php.ini vim /etc/ph ...

  6. IvorySQL v4 逻辑复制槽同步功能解析:高可用场景下的数据连续性保障

    功能简介 IvorySQL v4 基于 PostgreSQL 17,引入了逻辑复制槽同步至热备份数据库的功能.这一改进有效解决了旧版本中主数据库与备份数据库切换后逻辑复制中断的问题.对于那些追求数据高 ...

  7. 堆排序(topk 问题)(NB)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ # 比较排序 import random def sift(li, low, h ...

  8. docker学习 容器的启动过程

    这一节我们来稍微了解下docker原理性的东西1    docker run -i -t ubuntu /bin/bash输入上面这行命令,启动一个ubuntu容器时,到底发生了什么?大致过程可以用下 ...

  9. ASP.NET 自定义DataTable数据

    using System.Data; //DataTable try {     DataTable dt = new DataTable();     dt.Columns.Add("Bu ...

  10. 《Python基础教程》第三版语录

    对程序的结构(如需要哪些类和函数)有一定的想法后,建议你实现一个功能可能极其有限的简单版本. 当你有了可运行的程序后,将发现接下来的工作容易得多.你可添加新功能,修改不喜欢的方面,等等.这样你才能够真 ...