通過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.pswp.cn/news/281858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281858.shtml
英文地址,請注明出處:http://en.pswp.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…