`
ybak
  • 浏览: 34936 次
  • 性别: Icon_minigender_1
  • 来自: XX
社区版块
存档分类
最新评论

在应用中通过页面动态调整log4j的logger级别

阅读更多

    作为团队中的服务器开发人员,为了记录服务的执行信息以便跟踪,我们会在代码中添加大量不同级别的log信息.

    在开发环境中,我们会添加许多debug或者trace级别的log, 用来记录服务端的执行逻辑来诊断遇到的问题, 但在上线环境中,考虑到性能原因,我们通常会关闭debug和trace级别日志,只保留info和更严重级别的日志.

    系统上线后,我们偶尔会遇到一些莫名其妙的bug,通过仅有的info级别和更严重日志,有时候会很难诊断出问题所在.这时候,我们不禁希望能够在不重启服务器影响业务的情况下,把bug前后的debug甚至trace级别的日志记录下来.

     使用log4j,这样的需求很容易得到满足:

     一种方式是修改log4j配置文件,在应用不重启的情况下,让应用检测到配置文件的变化并重新加载log4j的配置文件.

     另一种方式是通过log4j的Api动态的logger的日志级别.

 

    第一种方式需要手工编写配置文件,在诊断应用时很不方便.

而通过后一种方式,我们可以编写一个管理页面,可以方便的随时对应用中所有的logger级别进行调整.

 

    实现后一种方式,只需要简单几行代码:

 

    private String changeLoggerLevel(String loggerName, String level) {
        Logger logger = LogManager.exists(loggerName);
        String result = null;
        if (logger != null) {
            logger.setLevel(Level.toLevel(level));
            result = logger.getName() + "|" + logger.getLevel();
        } else {
            result = "logger not exist.";
        }
        return result;
    }

    以上代码中,传入目标logger的名称和级别.使用log4j的Api,就能方便的动态调整日志级别.

 

 

    而在改变logger级别之前,我们希望能方便的列出logger列表,以便能找到我们调整目标logger的名称.可以通过以下方法来实现:

 

    private String listSubLoggerInfo(String loggerNamePrefix) {
        Enumeration<Logger> currentLoggers = LogManager.getCurrentLoggers();
        StringBuilder sb = new StringBuilder();
        while (currentLoggers.hasMoreElements()) {
            Logger logger = currentLoggers.nextElement();
            if (logger.getName().startsWith(loggerNamePrefix)) {
                sb.append(logger.getName()).append(":").append(logger.getLevel()).append("|");
            }
        }
        return sb.toString();
    }

    在以上方法中,我们传入loggerName的前缀,比如传入com.mycompany.myproject.service.方法将返回所有以此前缀开关的logger的信息:

 

com.mycompany.myproject.service.AService:INFO|com.mycompany.myproject.service.BService:INFO|.......

    这样我们就能快速锁定目标logger的名称,比如com.mycompany.myproject.service.AService和当前日志级别:INFO.

 

    通过以上两个简单的方法,我们就可以构建一个页面来显示logger列表,并调整日志logger的日志级别了.以下我编写的一个简单页面(用到了jquery):

 

   <jsp:output omit-xml-declaration="yes"/>
            <script type="text/javascript">
        $(document).ready(function() {
        	$('#levelForm').submit(function(){
        		$.post('changeLoggerLevel', $('#levelForm').serialize(),function(data,status){
                    alert(data);
             	});
        		return false;
        	});
        	$('#info').click(function(){
       			var infoDiv = $('#loggerInfo');
       			infoDiv.empty();
        		$.post('infoLogger', $('#levelForm').serialize(),function(data,status){
       				$.each(data.split("|").sort(),function(){
       					infoDiv.append($('<p>'+this+'</p>'));
       				});
             	});
        		return false;
        	});
        	var lastP;
        	$("#loggerInfo p").live('click', function(){
        		if(lastP){
        			lastP.css("background-color","");
        		}
       			lastP = $(this);
        		$(this).css("background-color","yellow");
        		$('#loggerName').val($(this).text().split(":")[0]);
        	});
        });
    </script>
    <form id="levelForm">
	  <p><label>LoggerName:</label><input id='loggerName' type="text" name="logger" style="width:600px" value="com.mycompany.myproject"/></p>
	  <p><label>LoggerLevel:</label>
		<select name="level">
			<option value="DEBUG">DEBUG</option>
			<option value="TRACE">TRACE</option>
			<option value="INFO">INFO</option>
			<option value="WARN">WARN</option>
			<option value="ERROR">ERROR</option>
			<option value="FATAL">FATAL</option>
			<option value="ALL">ALL</option>
			<option value="OFF">OFF</option>
		</select>
  	  </p>
  	  <input type="submit" value="Submit" />
  	  <input id="info" type="button" value="Info"/>
	</form>
	<div id="loggerInfo">
		
	</div>

 

 

    最后效果如图:

 

分享到:
评论

相关推荐

    Log4j-Logger详解

    Log4j-Logger详细说明以及应用

    Log4j简介 介绍log4j的原理和用法

    log4j的使用习惯,让每个类都拥有一个private static的...注意:在一个项目中,log4j环境只需要被配置一次,而不是在每个使用了logger的类里都需要调用一次 ,用MyClass.class作为参数创建该类的静态Logger对象 。

    log4j jar包

    日志类jar包 所属apache分类下 log4j-1.2.17!!! 

    Apache Log4j_1.2.17 完整依赖包

    Apache Log4j_1.2.17 完整依赖包,在jdk1.8.201中测试通过。使用教程https://www.tutorialspoint.com/springmvc/springmvc_log4j.htm

    log4j日志驱动包

    log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true # 应用于控制台 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=...

    Log4j日志包

    log4j.rootLogger=debug,CONSOLE,testfile,A1,MAIL ################### # Console Appender ################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Target=...

    log4j配置文件

    log4j.rootLogger=info, stdout, log, errorlog log4j.Logger=search,Test ###Console ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j....

    log4j-1.2.9

    log4j.rootLogger=DEBUG,A1 设置输出方式,常用的有: ConsoleAppender 在控制器中输出信息 RollingFileApperder 在文件中输出信息,设置此放式后必须设置file名称和路径 dailyRollingFileApperder 以日为单位划分在...

    log4j日志报错解决办法

    提示:log4j:WARN Please initialize the log4j system properly,log4j:WARN No appenders could be found for logger错误的处理办法

    Log4j日志管理系统简单使用说明

    这五个级别是有顺序的,DEBUG ,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高,则可以启动,否则屏蔽掉。    Java程序举例来说:    //建立Logger的一个...

    log4j-1.2.14

    log4j.rootLogger=DEBUG,A1 设置输出方式,常用的有: ConsoleAppender 在控制器中输出信息 RollingFileApperder 在文件中输出信息,设置此放式后必须设置file名称和路径 dailyRollingFileApperder 以日为单位划分在...

    log4j_properties配置详解

    ### set log levels ###log4j.rootLogger = debug , stdout , D , E### 输出到控制台 ###log4j.appender.stdout =org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target =System.outlog4j.appender.stdout....

    Java Log4j所需Jar包

    Java Log4j 1,2 所需Jar...用于日志记录的技术很多,如 jdk 的 logger 技术,apache 的 log4j、log4j2 技术等。 Log4j 的全称为 Log for java,即,专门用于 java 语言的日志记录工具。其目前有两个版 本:Log4j 与 Log4j2。

    使用log4j进行日志记录

    Log4j的包下载完成后,解压,将其中打包好的的log4j-1.x.x.jar导入你的工程LIB中。 Log4j之所以受欢迎的原因之一是它的灵活性。Log4j提供了灵活的配置方法,默认是调用BasicConfigurator.configure()来进行配置,但...

    log4j自定义日志文件名及日志输出格式

    根据项目需要,要求日志文件名及输出的日志内容头为特殊的格式,因此重写了log4j的一些方法,如要求的格式和项目不同,可根据示例参考进行再次的修改

    log4j.jar及log4j.xml

    包内整合了log4j.jar的jar包以及log4j.xml的xml文档,解压后直接使用

    Spring项目中怎么配置log4j

    NULL 博文链接:https://quicker.iteye.com/blog/676620

    slf4j-log4j

    用于Failed to load class "org.slf4j.impl.StaticLoggerBinder"问题的jar包

    Log4j 学习笔记.doc

    Log4j 学习笔记. 1. Log4j的类图 2. Logger:日志写出器 1. Logger的输出方法 2. Logger的命名规则 3. Log level 4. 示例代码 5. 关于logger的两点说明 3. Appender:日志目的地 1. ConsoleAppender 2. ...

    log4j.jar.rar

    主要是log4j的jar包,里面包含了log4j的日志文件,希望对你有帮助

Global site tag (gtag.js) - Google Analytics