0、引言

Java项目开发调试或维护过程中,为方便问题快速定位,很多时候都会在代码中增加相关日志,但为了减少日志输出量,在生产环境通常都提高了日志的级别,导致生产环境出现问题时调试信息没有打印出来,排查定位问题比较困难。

那么,能否动态修改日志的级别?答案是肯定的。当出现问题时,动态降低日志级别,输出相关的调试信息;问题解决后,动态提高日志级别,屏蔽相关的调试信息。

1、实现过程

1.1 动态修改Log4J的日志级别

以下代码在 log4j 1.2.17 版本上验证通过

package controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;/*** 动态修改j日志等级* @author chengesheng@gmail.com* @date 2017年6月17日 上午12:13:18* @note Log4jController*/
@Controller
@RequestMapping("/log4j")
public class Log4jController {@RequestMapping(value = "/root/{level}", method = RequestMethod.GET)@ResponseBodypublic String updateRootLog4jLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("level") String levelName) {Level level = Level.toLevel(levelName);LogManager.getRootLogger().setLevel(level);return "修改root的log4j{" + levelName + "}级别成功";}@RequestMapping(value = "/{package}/{level}", method = RequestMethod.GET)@ResponseBodypublic String updateLog4jLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("package") String packageName,@PathVariable("level") String levelName) {Level level = Level.toLevel(levelName);LogManager.getLogger(packageName).setLevel(level);return "修改package{" + packageName + "}的log4j{" + levelName + "}级别成功";}
}

1.2 动态修改Logback的日志级别

以下代码在 logback 1.2.3 版本上验证通过

package controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;/*** 动态修改logback日志级别* @author cgs1999@126.com* @time 2020年4月7日 下午3:29:21* @since 1.0.0*/
@Controller
@RequestMapping("/logback")
public class LogbackController {@RequestMapping(value = "/root/{level}", method = RequestMethod.GET)@ResponseBodypublic String updateRootLogbackLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("level") String levelName) {LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();loggerContext.getLogger(Logger.ROOT_LOGGER_NAME).setLevel(Level.toLevel(levelName));return "修改root的logback{" + levelName + "}级别成功";}@RequestMapping(value = "/{package}/{level}", method = RequestMethod.GET)@ResponseBodypublic String updateLogbackLevel(HttpServletRequest request, HttpServletResponse response, @PathVariable("package") String packageName,@PathVariable("level") String levelName) {LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();loggerContext.getLogger(packageName).setLevel(Level.toLevel(levelName));return "修改package{" + packageName + "}的logback{" + levelName + "}级别成功";}
}

2、验证

通过浏览器访问下面地址进行验证

## 修改log4j的root的日志级别
http://<ip>:<port>/<contextPath>/log4j/root/DEBUG
http://<ip>:<port>/<contextPath>/log4j/root/INFO
http://<ip>:<port>/<contextPath>/log4j/root/ERROR## 修改log4j的org.apache包的日志级别
http://<ip>:<port>/<contextPath>/log4j/org.apache/DEBUG
http://<ip>:<port>/<contextPath>/log4j/org.apache/INFO
http://<ip>:<port>/<contextPath>/log4j/org.apache/ERROR## 修改logback的root的日志级别
http://<ip>:<port>/<contextPath>/logback/root/DEBUG
http://<ip>:<port>/<contextPath>/logback/root/INFO
http://<ip>:<port>/<contextPath>/logback/root/ERROR## 修改logback的org.apache包的日志级别
http://<ip>:<port>/<contextPath>/logback/org.apache/DEBUG
http://<ip>:<port>/<contextPath>/logback/org.apache/INFO
http://<ip>:<port>/<contextPath>/logback/org.apache/ERROR

3、参考资料

  • springboot中动态修改logback日志级别
    https://www.cnblogs.com/heqiyoujing/p/9470752.html
  • 动态修改日志级别小工具
    https://segmentfault.com/a/1190000013169276
  • Spring Boot配置log4j记录日志
    https://blog.csdn.net/zzq900503/article/details/87629782

动态修改Log4J和Logback的日志级别相关推荐

  1. oracle 删除jobs日志,修改Oracle的Job Scheduler 日志级别及删除运行日志

    修改Oracle的Job Scheduler 日志级别及删除运行日志 发布时间:2020-07-04 01:30:09 来源:51CTO 阅读:2747 作者:孤月2012 Job 运行久了会产生大量 ...

  2. java log4j基本配置及日志级别配置详解,java基础面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  3. oracle sql删除job,修改Oracle的Job Scheduler 日志级别及删除运行日志

    Oracle的Job 运行久了会产生大量运行日志,这些信息可通过下面的方式清除: 1.创建job: Create job links to previous job class. DBMS_SCHED ...

  4. log4j的8个日志级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL)

    log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级从高到低依次为:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE. ALL. ALL 最低等 ...

  5. Logback设置日志级别

    使用Logback设置日志的设置方式现在已经有很多文章说明,本文重点说明不同设置方式的区别和用途.首先列举常用的三种方式,接下来说明其区别. appender中的LevelFilter:级别过滤器,根 ...

  6. oracle 修改jobs执行时间,修改Oracle的Job Scheduler 日志级别及删除运行日志

    Job 运行久了会产生大量运行日志,这些信息可通过下面的方式清除: 1.创建job:Create job links to previous job class. DBMS_SCHEDULER.cre ...

  7. 修改mysql5.7的错误日志级别

    mysql5.7,启用基于logical_clock的多线程复制,发现error日志增长很快,查看日志发现大量关于多线程复制的Note级别日志. 2018-07-03T03:22:01.638371+ ...

  8. 动态修改logback日志级别

    背景 应用在线上部署时,一般日志级别会设置为info级别.一些流量高的应用,甚至会设置为error级别.这样日志打的少了,日志文件就不会变的太大,接口的性能也会更高.但缺点也显而易见,出现问题时,由于 ...

  9. Spring Boot 2动态修改日志级别

    本文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本. 作为程序猿,定位问题是我们的日常工作,而日志是我们定位问题非常重要的依据.传统方式定位问题时,往往是如下 ...

  10. 求你了,别再随便打日志了,教你动态修改日志级别!

    GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! 之前写过一篇文章<明明有自动清理,日志还是把我的服务干爆了!>,介绍过一次大促故障,是因为日志量激增,导致服务器 ...

最新文章

  1. json jsono wsdl_记录一下json的生成
  2. 接口中可以有静态方法吗?
  3. [云炬创业基础笔记]第一章创业环境测试10
  4. 住过一晚两万的ICU后,我还是建议你不要轻易买保险
  5. javascript - 封装原生js实现ajax
  6. 霍金警告人工智能危险性 称其若失控很难被阻止
  7. paip.java 注解的详细使用代码
  8. 教你webm格式怎么转换成mp4
  9. 纯js 写一个秒表 (精确到毫秒)
  10. FastDFS——Bug篇——上传txt文档乱码
  11. goldwave简单使用
  12. 苹果手机向windows电脑传照片和视频 无法链接设备或连接到系统上的设备没有发挥作用解决方法
  13. 把代码写烂点,你在公司就不可代替了?
  14. ih5连接mysql数据库_iH5高级教程:H5数据应用,数据库基础
  15. SIM卡、USIM卡、UICC卡、eSIM卡的区别
  16. 综述笔记-多无人机多目标任务分配1
  17. 国产ARM核心工控主板介绍
  18. 数据通信网的交换方式
  19. 基于java+ssm的家庭理财系统
  20. 最容易被人工智能取代的10种职业,今年换工作别入坑了!

热门文章

  1. python勒索病毒代码_.Lucky后缀勒索病毒数据解密(示例代码)
  2. MEGA2560 arduino烧录USB 芯片flash以及bootloader记录
  3. 计算机声音管理器不见了,Realtek高清晰音频管理器怎么找不到打开教程
  4. 可能是最高颜值的三方网易云音乐播放器 (全平台支持)
  5. 计算机毕业设计 安卓 Android studio音乐播放器app 仿酷狗,仿网易云音乐播放器
  6. android 保活 sdk 信鸽,腾讯信鸽推送平台Android sdk推荐_腾讯信鸽推送平台Android sdk使用教程...
  7. 如何做好一位合格qc_如何做好现场QC,一位老QC的经验分享
  8. xlsread错误使用matlab,运行显示错误使用xlsread,未找到文件
  9. 深入理解c语言运算符优先级
  10. ps知识的教学 day01