动态修改Log4J和Logback的日志级别
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的日志级别相关推荐
- oracle 删除jobs日志,修改Oracle的Job Scheduler 日志级别及删除运行日志
修改Oracle的Job Scheduler 日志级别及删除运行日志 发布时间:2020-07-04 01:30:09 来源:51CTO 阅读:2747 作者:孤月2012 Job 运行久了会产生大量 ...
- java log4j基本配置及日志级别配置详解,java基础面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- oracle sql删除job,修改Oracle的Job Scheduler 日志级别及删除运行日志
Oracle的Job 运行久了会产生大量运行日志,这些信息可通过下面的方式清除: 1.创建job: Create job links to previous job class. DBMS_SCHED ...
- 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 最低等 ...
- Logback设置日志级别
使用Logback设置日志的设置方式现在已经有很多文章说明,本文重点说明不同设置方式的区别和用途.首先列举常用的三种方式,接下来说明其区别. appender中的LevelFilter:级别过滤器,根 ...
- oracle 修改jobs执行时间,修改Oracle的Job Scheduler 日志级别及删除运行日志
Job 运行久了会产生大量运行日志,这些信息可通过下面的方式清除: 1.创建job:Create job links to previous job class. DBMS_SCHEDULER.cre ...
- 修改mysql5.7的错误日志级别
mysql5.7,启用基于logical_clock的多线程复制,发现error日志增长很快,查看日志发现大量关于多线程复制的Note级别日志. 2018-07-03T03:22:01.638371+ ...
- 动态修改logback日志级别
背景 应用在线上部署时,一般日志级别会设置为info级别.一些流量高的应用,甚至会设置为error级别.这样日志打的少了,日志文件就不会变的太大,接口的性能也会更高.但缺点也显而易见,出现问题时,由于 ...
- Spring Boot 2动态修改日志级别
本文基于:Spring Boot 2.1.3,理论支持Spring Boot 2.x所有版本. 作为程序猿,定位问题是我们的日常工作,而日志是我们定位问题非常重要的依据.传统方式定位问题时,往往是如下 ...
- 求你了,别再随便打日志了,教你动态修改日志级别!
GitHub 19k Star 的Java工程师成神之路,不来了解一下吗! 之前写过一篇文章<明明有自动清理,日志还是把我的服务干爆了!>,介绍过一次大促故障,是因为日志量激增,导致服务器 ...
最新文章
- json jsono wsdl_记录一下json的生成
- 接口中可以有静态方法吗?
- [云炬创业基础笔记]第一章创业环境测试10
- 住过一晚两万的ICU后,我还是建议你不要轻易买保险
- javascript - 封装原生js实现ajax
- 霍金警告人工智能危险性 称其若失控很难被阻止
- paip.java 注解的详细使用代码
- 教你webm格式怎么转换成mp4
- 纯js 写一个秒表 (精确到毫秒)
- FastDFS——Bug篇——上传txt文档乱码
- goldwave简单使用
- 苹果手机向windows电脑传照片和视频 无法链接设备或连接到系统上的设备没有发挥作用解决方法
- 把代码写烂点,你在公司就不可代替了?
- ih5连接mysql数据库_iH5高级教程:H5数据应用,数据库基础
- SIM卡、USIM卡、UICC卡、eSIM卡的区别
- 综述笔记-多无人机多目标任务分配1
- 国产ARM核心工控主板介绍
- 数据通信网的交换方式
- 基于java+ssm的家庭理财系统
- 最容易被人工智能取代的10种职业,今年换工作别入坑了!
热门文章
- python勒索病毒代码_.Lucky后缀勒索病毒数据解密(示例代码)
- MEGA2560 arduino烧录USB 芯片flash以及bootloader记录
- 计算机声音管理器不见了,Realtek高清晰音频管理器怎么找不到打开教程
- 可能是最高颜值的三方网易云音乐播放器 (全平台支持)
- 计算机毕业设计 安卓 Android studio音乐播放器app 仿酷狗,仿网易云音乐播放器
- android 保活 sdk 信鸽,腾讯信鸽推送平台Android sdk推荐_腾讯信鸽推送平台Android sdk使用教程...
- 如何做好一位合格qc_如何做好现场QC,一位老QC的经验分享
- xlsread错误使用matlab,运行显示错误使用xlsread,未找到文件
- 深入理解c语言运算符优先级
- ps知识的教学 day01