基于JMX动态配置Log4J日志级别
先来看比较low的修改日志级别的方式,在写程序里面。
http://blog.gssxgss.me/java%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8A%A8%E6%80%81%E6%94%B9%E5%8F%98%E6%97%A5%E5%BF%97%E7%BA%A7%E5%88%AB/
再来通过JMX的方法动态修改程序的日志级别。
https://blog.csdn.net/z2007130205/article/details/23910431
package com.minxinloan.common.log; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedOperationParameter;
import org.springframework.jmx.export.annotation.ManagedOperationParameters;
import org.springframework.jmx.export.annotation.ManagedResource; /**
* 基于JMX动态配置Log4J日志级别,并控制Trace开关的MBean.
*
* @author z
* @version 2013-12-10
*/
@ManagedResource(objectName = Log4jManager.MBEAN_NAME, description = "Log4j Management Bean")
public class Log4jManager { /**
* Log4jManager的Mbean的注册名称.
*/
public static final String MBEAN_NAME = "log4j:name=Log4j"; private static org.slf4j.Logger managerLogger = LoggerFactory.getLogger(Log4jManager.class); private String projectLoggerName; @ManagedAttribute(description = "Level of the root logger")
public String getRootLoggerLevel() {
Logger logger = Logger.getRootLogger();
// MBeanServer server = MBeanServerFactory.createMBeanServer();
return logger.getEffectiveLevel().toString();
} @ManagedAttribute
public void setRootLoggerLevel(String newLevel) {
Logger logger = Logger.getRootLogger();
Level level = Level.toLevel(newLevel);
logger.setLevel(level);
managerLogger.info("设置Root Logger 级别为{}", newLevel);
} /**
* 获得项目默认logger的级别.
* 项目默认logger名称通过#setProjectLoggerName(String)配置.
*/
@ManagedAttribute(description = "Level of the project default package logger")
public String getProjectLoggerLevel() {
if (projectLoggerName != null) {
return getLoggerLevel(projectLoggerName);
} return null;
} /**
* 设置项目默认logger的级别.
* 项目默认logger名称通过#setProjectLoggerName(String)配置.
*/
@ManagedAttribute
public void setProjectLoggerLevel(String newLevel) {
if (projectLoggerName != null) {
setLoggerLevel(projectLoggerName, newLevel);
}
} /**
* 获取Logger的日志级别.
*/
@ManagedOperation(description = "Get logging level of the logger")
@ManagedOperationParameters({ @ManagedOperationParameter(name = "loggerName", description = "Logger name") })
public String getLoggerLevel(String loggerName) {
Logger logger = Logger.getLogger(loggerName);
return logger.getEffectiveLevel().toString();
} /**
* 设置Logger的日志级别.
* 如果日志级别名称错误, 设为DEBUG.
*/
@ManagedOperation(description = "Set new logging level to the logger")
@ManagedOperationParameters({ @ManagedOperationParameter(name = "loggerName", description = "Logger name"),
@ManagedOperationParameter(name = "newlevel", description = "New level") })
public void setLoggerLevel(String loggerName, String newLevel) {
Logger logger = Logger.getLogger(loggerName);
Level level = Level.toLevel(newLevel);
logger.setLevel(level);
managerLogger.info("设置{}级别为{}", loggerName, newLevel);
} /**
* 根据log4j.properties中的定义, 设置项目默认的logger名称
*/
public void setProjectLoggerName(String projectLoggerName) {
this.projectLoggerName = projectLoggerName;
} }
import static org.junit.Assert.assertEquals; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.Test; import com.minxinloan.common.log.Log4jManager; public class Log4jManagerTest { @Test
public void testLoggerLevel() {
String loggerName = "org.springside.modules";
Log4jManager mbean = new Log4jManager();
String orgLevel = mbean.getLoggerLevel(loggerName); Logger.getLogger(loggerName).setLevel(Level.FATAL);
assertEquals("FATAL", mbean.getLoggerLevel(loggerName)); mbean.setLoggerLevel(loggerName, "TRACE");
assertEquals("TRACE", mbean.getLoggerLevel(loggerName)); mbean.setLoggerLevel(loggerName, "WRONG_LEVEL_NAME");
assertEquals("DEBUG", mbean.getLoggerLevel(loggerName)); mbean.setLoggerLevel(loggerName, orgLevel);
}
}
package com.minxinloan.common.log; import org.apache.log4j.Level;import org.apache.log4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.jmx.export.annotation.ManagedAttribute;import org.springframework.jmx.export.annotation.ManagedOperation;import org.springframework.jmx.export.annotation.ManagedOperationParameter;import org.springframework.jmx.export.annotation.ManagedOperationParameters;import org.springframework.jmx.export.annotation.ManagedResource; /** * 基于JMX动态配置Log4J日志级别,并控制Trace开关的MBean. * * @author z * @version 2013-12-10 */@ManagedResource(objectName = Log4jManager.MBEAN_NAME, description = "Log4j Management Bean")public class Log4jManager { /** * Log4jManager的Mbean的注册名称. */public static final String MBEAN_NAME = "log4j:name=Log4j"; private static org.slf4j.Logger managerLogger = LoggerFactory.getLogger(Log4jManager.class); private String projectLoggerName; @ManagedAttribute(description = "Level of the root logger")public String getRootLoggerLevel() {Logger logger = Logger.getRootLogger();//MBeanServer server = MBeanServerFactory.createMBeanServer();return logger.getEffectiveLevel().toString();} @ManagedAttributepublic void setRootLoggerLevel(String newLevel) {Logger logger = Logger.getRootLogger();Level level = Level.toLevel(newLevel);logger.setLevel(level);managerLogger.info("设置Root Logger 级别为{}", newLevel);} /** * 获得项目默认logger的级别. * 项目默认logger名称通过#setProjectLoggerName(String)配置. */@ManagedAttribute(description = "Level of the project default package logger")public String getProjectLoggerLevel() {if (projectLoggerName != null) {return getLoggerLevel(projectLoggerName);} return null;} /** * 设置项目默认logger的级别. * 项目默认logger名称通过#setProjectLoggerName(String)配置. */@ManagedAttributepublic void setProjectLoggerLevel(String newLevel) {if (projectLoggerName != null) {setLoggerLevel(projectLoggerName, newLevel);}} /** * 获取Logger的日志级别. */@ManagedOperation(description = "Get logging level of the logger")@ManagedOperationParameters({ @ManagedOperationParameter(name = "loggerName", description = "Logger name") })public String getLoggerLevel(String loggerName) {Logger logger = Logger.getLogger(loggerName);return logger.getEffectiveLevel().toString();} /** * 设置Logger的日志级别. * 如果日志级别名称错误, 设为DEBUG. */@ManagedOperation(description = "Set new logging level to the logger")@ManagedOperationParameters({ @ManagedOperationParameter(name = "loggerName", description = "Logger name"),@ManagedOperationParameter(name = "newlevel", description = "New level") })public void setLoggerLevel(String loggerName, String newLevel) {Logger logger = Logger.getLogger(loggerName);Level level = Level.toLevel(newLevel);logger.setLevel(level);managerLogger.info("设置{}级别为{}", loggerName, newLevel);} /** * 根据log4j.properties中的定义, 设置项目默认的logger名称 */public void setProjectLoggerName(String projectLoggerName) {this.projectLoggerName = projectLoggerName;} }
基于JMX动态配置Log4J日志级别的更多相关文章
- 动态调整Log4j日志级别
log4j2.xml配置文件中支持配置monitorInterval参数,检测到配置改变后重新加载,达到动态调整日志级别的效果. 故调整日志级别无须手动重启服务. log4j2.xml配置文件示意: ...
- 基于java配置log4j日志详解
1.Log4j 1.1了解Log4j Log4j是Apache的一个开源项目,通过使用log4j,我们可以控制日志信息输送的目的地可以是控制台.文件.GUI组件,我们也可以控制每一条日志的输出格式,通 ...
- java log4j基本配置及日志级别配置详解
java log4j日志级别配置详解 1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾 ...
- log4j.xml配置,包含自定义log4j日志级别及输出日志到不同文件
一.配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configura ...
- ELK环境配置+log4j日志记录
ELK环境配置+log4j日志记录 1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一 ...
- SpringBoot实用小技巧之动态设置SpringBoot日志级别
有时线上问题我们用打日志的方式来观察错误或埋点参数,但由于这些日志如果都打出来会占用大量存储空间而且覆盖了一些有效信息,所以线上级别一般设置INFO,调试级别用作特殊情况下.此时如果线上想查看调试级别 ...
- Log4j.properties 属性详解以及 LOG4J日志级别详解
转自:https://blog.csdn.net/lovely0903jpp/article/details/82261607 假如项目的生产环境上增加请求以及响应信息的打印,这个时候,对于新手来说, ...
- springboot中动态修改log4j2日志级别
springboot中动态修改log4j2日志级别 在spring boot中使用log4j2日志时,项目运行中,想要修改日志级别. 1.pom.xml依赖: <dependency> & ...
- (转)log4j日志级别设置成DEBUG时输出Html代码等问题:
log4j日志级别设置成DEBUG时输出Html代码等问题: 问题: log4j日志级别设置成DEBUG时会输出很多信息,包括一些Html代码 解决方案: log4j的控制是树形,所以在log4j.p ...
随机推荐
- ios-UITextView输入时,字数限制的倒数及对超出的字数进行截取并弹出提示框
效果图如上,主要是右上角的Label显示框,创建完各控件后,可以在代理方法里贴上下面代码: -(void)textViewDidChange:(UITextView *)obj { UITextVie ...
- 算法设计与分析基础 (Anany Levitin 著)
第1章 绪论 1.1 什么是算法 1.2 算法问题求解基础 1.2.1 理解问题 1.2.2 了解计算设备的性能 1.2.3 在精确解法和近似解法之间做出选择 1.2.4 算法的设计技术 1.2.5 ...
- oracle-rman-2
归档日志的备份 RMAN> list archivelog all;show archivelog deletion policy;configure archivelog deletion p ...
- Java之SimpleDateFormat日期格式转换(Date 和 String 类型之间的转换)
SimpleDateFormat : 可以选择任何用户定义的日期-时间格式的模式 "yyyy-MM-dd HH:mm:ss:SSS"1.格式化:Date -->Stri ...
- Android 开发 技术大纲
大家好, 下面 是 Android 开发 的 技术大纲, 觉得 画的很好, 所以 转载过来, 这个 技术大纲 出自 “享学课堂” .
- 推荐一个 基于 WebSocket 和 Redis 的 即时通信 开源项目
项目地址 : https://github.com/2881099/im 大家可以和 SignalR 比较看看 , 如何 ? ^^ ^^ ^^ 这是一个 网友 写的 , 他还写了 ...
- 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink--容错机制(ACK,RDD,基于log和状态快照),消息处理at least once,exactly once两个是关键
分布式流处理是对无边界数据集进行连续不断的处理.聚合和分析.它跟MapReduce一样是一种通用计算,但我们期望延迟在毫秒或者秒级别.这类系统一般采用有向无环图(DAG). DAG是任务链的图形化表示 ...
- Python应用场景 (转)
Web应用开发 Python经常被用于Web开发.比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序.Python定义了WSGI标准应用接口来协调Http服务器与基于P ...
- py-day1-3 python基本数据类型
数据的基本类型: 数字:
- CentOS6.5_64位系统下安装配置postfix邮件系统 启用并配置SMTP虚拟账户
http://blog.jjonline.cn/linux/185.html http://www.cnblogs.com/apexchu/p/4271264.html 用户新增和删除 http:// ...