基于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;} }

原文地址:https://www.cnblogs.com/mkl34367803/p/10630749.html

时间: 2024-11-09 02:21:51

基于JMX动态配置Log4J日志级别的相关文章

Log4J日志配置详解和自定义log4j日志级别及输出日志到不同文件实现方法

Log4J日志配置详解 一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders(输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN <

java log4j基本配置及日志级别配置详解

java log4j日志级别配置详解 1.1 前言 说出来真是丢脸,最近被公司派到客户公司面试外包开发岗位,本来准备了什么redis.rabbitMQ.SSM框架的相关面试题以及自己做过的一些项目回顾,信心满满地去面试,结果别人一上来就问到了最近项目使用的日志系统是什么?日志级别是怎么配置的?当时我都蒙X了,平时都是项目经理搭的,我自己也是随便上网一搜往配置文件一黏贴就OK了.我就这么说完后面试官深深定了我一眼,当时我的内心羞愧到...... 1.2 闲话少说,讲讲日志的发展故事(如果已经了解的

hadoop 动态设置调整日志级别

Hadoop急诊室的半小时:动态设置调整日志级别 技术 大数据蜗牛 2015.02.03 本文通过一个在实际工作中所遇到的线上问题来告诉广大数据从业者一条通俗有用的人生哲理:线上遇到这样的问题,千万要冷静,越是着急越容易出乱子!心急吃不了热豆腐. 十万火急 上周二,朋友公司的Hadoop集群服务不可用,从早上9点开始一直持续到12点.业务方催得比较急,希望尽快恢复,至少给个可以恢复的时间点.这种心情做过线上服务运维的同学应该都能理解.特别是在没有任何思路的情况下,就只能干着急! 症状了解 朋友联

自定义log4j日志级别

转载自:  http://blog.csdn.net/seven_cm/article/details/26849821 参考了网上资料:http://www.360doc.com/content/13/0527/11/10825198_288498671.shtml 因为项目中需要输出一些特别的日志来做数据统计.如果开启log4j提供的INFO日志级别,每天生成的日志文件就会变得越来越大.这样就得写个定 时任务来删除这个文件.为了只输出所需的日志级别,唯有自己定义一个log4j的级别,这样一来

springboot配置Log4j日志

目录 Pom.xml添加依赖 在控制器记录日志 使用AOP统一处理Web请求日志 导入AOP依赖 写一个切面类 @(springboot配置Log4j日志) 首先要导入log4j属性文件 Log4j.properties 在resources文件夹下导入log4j.properties文件,复制下面的内容时,每行后面如果有空格的话一定要去掉,log4j.appender.File.File为log日志存放的路径. log4j.rootLogger=INFO,Console,File log4j.

java Web应用配置log4j日志记录

第一步:首先建立一个WEB工程,去log4j官网下log4j的JAR包导入到工程的lib目录下 第二步:在src目录下建一个log4j.properties 文件,文件命名可以由自己,只是记加载时候和这里名字一致就行: log4j.properties  里边的内容如下: ### set log levels ### log4j.rootLogger = debug,stdout,E log4j.appender.stdout = org.apache.log4j.ConsoleAppender

配置log4j日志信息

一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置. 1.Loggers Loggers组件在此系统中被分为五个级别:DEBUG.INFO.WARN.ERROR和FATAL.这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR <

Spring项目配置log4j日志功能

一,添加log4j依赖包 可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包如使用maven,可以添加如下依赖 <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>

Log4j 日志级别

转自:http://michales003.iteye.com/blog/1160605 日志记录器(Logger)是日志处理的核心组件.log4j具有5种正常级别(Level).: 1.static Level DEBUG : DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的. 2.static Level INFO INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程. 3.static Level WARN WARN level表明会出现潜在错误的情形