通过url来设置log4j的记录级别

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

直接看代码。

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;@Controller
@RequestMapping(value = "/log4j")
public class Log4jController {private Map<String, Logger> log4jLoggers = new HashMap<>();private Map<String, AppenderSkeleton> log4jAppenders = new HashMap<>();@PostConstructpublic void init() {loadLog4j();}private void loadLog4j() {Enumeration<?> loggers = LogManager.getLoggerRepository().getCurrentLoggers();//获取所有loggerwhile (loggers.hasMoreElements()) {Object elem = loggers.nextElement();if (elem instanceof org.apache.log4j.Logger) {org.apache.log4j.Logger log4j = (org.apache.log4j.Logger) elem;log4jLoggers.put(log4j.getName(), log4j);Enumeration<?> allAppenders = log4j.getAllAppenders();//获取logger相关的appenderwhile (allAppenders.hasMoreElements()) {Object apd = allAppenders.nextElement();if (apd instanceof AppenderSkeleton) {AppenderSkeleton appender = (AppenderSkeleton) apd;log4jAppenders.put(appender.getName(), appender);}}}}}@RequestMapping(value = "/setLoggerLevel")@ResponseBodypublic String setLoggerLevel(HttpServletRequest request) {String logName = request.getParameter("name");String levelStr = request.getParameter("level");Level level = Level.toLevel(levelStr, null);org.apache.log4j.Logger log4j = log4jLoggers.get(logName);if (log4j == null) {return "没有相应的logger[" + logName + "]存在";}if (level == null) {return "没有相应的日志级别[" + levelStr + "]存在";}log4j.setLevel(level);return "将日志logger[" + logName + "]设置为" + level.toString() + "模式";}@RequestMapping(value = "/setAppenderLevel")@ResponseBodypublic String setAppenderLevel(HttpServletRequest request) {String appenderName = request.getParameter("name");String levelStr = request.getParameter("level");Level level = Level.toLevel(levelStr, null);Response response = new Response();AppenderSkeleton appender = log4jAppenders.get(appenderName);if (appender == null) {return "没有相应的appender[" + appenderName + "]存在";}if (level == null) {return "没有相应的日志级别[" + levelStr + "]存在";}appender.setThreshold(level);return "将日志appender[" + appenderName + "]设置为" + level.toString() + "模式";}
}

 

转载于:https://my.oschina.net/linchuhao23/blog/2248901

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过用户模型,对数据库进行增删改查操作

增加&#xff1a;user db.session.add(user)db.session.commit() #增加 user User(username JACKSON,password0328 ) db.session.add(user) db.session.commit() 查询&#xff1a;User.query.filter(User.username mis1114).first() #查询 userUser.query.filter(User.usern…

Android OpenGL ES(七)----理解纹理与纹理过滤

1.理解纹理 OpenGL中的纹理能够用来表示图像。照片&#xff0c;甚至由一个数学算法生成的分形数据。每一个二维的纹理都由很多小的纹理元素组成。它们是小块的数据&#xff0c;类似于我们前面讨论过的片段和像素。要使用纹理&#xff0c;最经常使用的方式是直接从一个图像文件载…

WPF 基础控件之托盘

WPF 基础控件之托盘控件名&#xff1a;NotifyIcon作者&#xff1a; WPFDevelopersOrg - 吴锋|驚鏵原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。新建NotifyIcon自定义…

java 匿名 异常_JAVA类(内部类、匿名内部类、异常、自定义异常)

内部类package AA;public class类 {int de123;StringBuffer deenewStringBuffer();public class成员内部类{public voidff() {System.out.println("这是成员内部类方法");}}/*1.可以访问外部类所有的成员&#xff0c;包括被声明为私有(private)的&#xff1b;2.可以使…

ASP.NET 多环境下配置文件web.config的灵活配置---转

注意&#xff1a;本功能在.Net Core中已经不可用&#xff0c;暂时需手动修改web.config中的信息&#xff0c;或者将其设置在appsettings.XXX.json中&#xff0c;然后再使用web.config中的环境变量来制定使用的具体appsettings文件。 转自&#xff1a;https://www.cnblogs.com/h…

英语之各类人群

工作狂&#xff1a;workaholic 月光族&#xff1a;moonlight group 电灯泡&#xff1a;third wheel 菜鸟&#xff1a;newbie 夜猫子&#xff1a;night owl 路痴&#xff1a;somebody has no sense of derection 宅男宅女&#xff1a;homebody 时尚的潮人&#xff1a;trend sett…

Wget CVE-2014-4877:FTP 符号链接任意文件系统访问

Wget 爆出 CVE-2014-4877 漏洞&#xff1a;FTP 符号链接任意文件系统访问。 Package: wgetVersion: 1.15-1Severity: important Upstream fix&#xff1a; http://git.savannah.gnu.org/cgit/wget.git/commit/?id18b0979357ed7dc4e11d4f2b1d7e0f5932d82aa7 References&#xf…

JavaScript 学习提升

javascript 技能提升 理解闭包 闭包&#xff0c;官方对闭包的解释是&#xff1a;一个拥有许多变量和绑定了这些变量的环境的表达式&#xff08;通常是一个函数&#xff09;&#xff0c;因而这些变量也是该表达式的一部分。闭包的特点&#xff1a;1. 作为一个函数变量的一个引用…

Uranium UI Kit

Uranium UI Kit控件名&#xff1a;Uranium UI Ki作者&#xff1a;enisn原文链接&#xff1a; https://github.com/enisn/UraniumUI项目使用 Apache-2.0 开源许可协议。Uranium 是用于 .NET MAUI 的免费和开源 UI 工具包。它提供了一组控件和实用程序来构建现代应用程序。它建…

数据库监控框架 oneproxy-monitor 开源了

OneProxy-Monitor 是数据库监控的框架&#xff0c;通过这个框架可以快速的开发出一款数据库的监控软件。目前已经在这个框架下面开发出来了sql server的监控软件oneproxy-for-sqlserver&#xff0c; postgresql的监控软件oneproxy-for-postgresql。并且还可以作为协议成的调试软…

java nio epoll_Java NIO 选择器(Selector)的内部实现(poll epoll)

http://blog.csdn.net/hsuxu/article/details/9876983之前强调这么多关于linux内核的poll及epoll&#xff0c;无非是想让大家先有个认识&#xff1a;Java NIO中的选择器依赖操作系统内核的这些系统调用&#xff0c;我们这里只讲解与linux内核相关的NIO实现&#xff0c;当然&…

Next.js 7发布,构建速度提升40%

Next.js团队发布了其开源React框架的7版本。该版本的Next.js主要是改善整体的开发体验&#xff0c;包括启动速度提升57%、开发时的构建速度提升40%、改进错误报告和WebAssembly支持。\\Next.js是一个React框架&#xff0c;它的主要目标是在生产环境中提供出色的性能和良好的开发…

《Java多线程编程核心技术》读后感(十五)

线程的状态 线程对象在不同的运行时期有不同的状态&#xff0c;状态信息就存在与State枚举类中。 验证New,Runnable&#xff0c;Terminated new:线程实例化后还从未执行start()方法时的状态 runnable&#xff1a;线程进入运行的状态 terminated&#xff1a;线程被销毁时的状态 …

队列(queue)

队列(queue)和栈一样支持push和pop两个操作。但与栈不同的是,pop两个操作。但与栈的不同的是&#xff0c;pop完成的不是取出最顶端的元素&#xff0c;而是最底端的元素。也就是说最初放入的元素能够最先被取出&#xff08;这种行为被叫做FIFO:First In First Out&#xff0c;即…

一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]

ASP.NET Core应用本质上就是一个由中间件构成的管道&#xff0c;承载系统将应用承载于一个托管进程中运行起来&#xff0c;其核心任务就是将这个管道构建起来。在ASP.NET Core的发展历史上先后出现了三种应用承载的编程方式&#xff0c;而且后一种编程模式都提供了针对之前编程…

java程序猿面试问缺点怎么回答_JAVA程序员面试32问,你能回答多少题

第一&#xff0c;谈谈final&#xff0c; finally&#xff0c; finalize的区别。第二&#xff0c;Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类&#xff0c;是否可以implements(实现)interface(接口)&#xff1f;第三&#xff0c;Static Nested Class 和 In…

ExecutorService——shutdown方法和awaitTermination方法

ExecutorService的关闭shutdown和awaitTermination为接口ExecutorService定义的两个方法&#xff0c;一般情况配合使用来关闭线程池。 方法简介shutdown方法&#xff1a;平滑的关闭ExecutorService&#xff0c;当此方法被调用时&#xff0c;ExecutorService停止接收新的任务并且…

WPF 简单模仿 VSCode 界面布局

WPF 简单模仿 VSCode 界面布局本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。WPF 简单模仿 VSCode 界面布局作者&#xff1a;弈虎-吕女士会翻墙原文链接&#xff1a; https://github.com/Chen-Lin-Zhao-Wei/WPFLikeVSCode分享一篇群友这几天自己写的 WPF 简…

compare()方法+使用compare方法

compare()方法 compare(lob1,lob2,amount,offset_1,offset_2) 1用于比较2个lob存储的数据&#xff0c;比较的方式是从指定偏移量开始&#xff0c;对指定数量的字符或者字节进行比较。 2如果比较内容相同&#xff0c;返回0&#xff0c;否则返回-1或1. 3如果参数设置有误或不合…

linux 下 mysql默认表_linux环境下mysql默认是区分表名大小写的

在linux环境下&#xff0c;mysql默认表明是区分大小写的&#xff0c;我们可以查看全局变量发现:mysql> show variables like lower%;-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_cas…