`
ybak
  • 浏览: 35428 次
  • 性别: 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的日志级别

    4. **Web应用中的动态设置**:在Web应用中,可以创建一个Servlet或JSP页面来接收用户的选择并动态调整日志级别。比如,`changeLogLevel.jsp`可能就是这样一种实现。用户在前端选择日志级别,然后发送请求到这个页面...

    LOG4J的使用

    LOG4J允许开发者通过配置文件动态地调整日志行为,而无需重新编译和部署应用。 2. **丰富的功能** 支持多种日志级别、多种输出目的地以及自定义的日志格式。 3. **易于集成** LOG4J可以轻松地集成到各种Java...

    学习log4j的例子

    在这些源代码中,可以看到如何通过导入`org.apache.log4j.*`包来创建Logger对象,设置日志级别(如DEBUG, INFO, WARN, ERROR, FATAL),并调用`log()`方法记录日志信息。 `log4j`目录可能包含了Log4j的配置文件,最...

    log4j 帮助文档

    这个“log4j帮助文档”集合包含了详细的页面实例、CMD格式的文档介绍以及Word文档,旨在帮助开发者深入理解和熟练运用Log4j。以下是关于Log4j的一些关键知识点: 1. **基本概念** - **Logger**: 日志记录器,是...

    log4j-users-guide.pdf

    6. **Web应用和JSP**:在Web环境中,Log4j可以与Servlet容器集成,为Web应用程序和JSP页面提供日志服务。文档讨论了如何在这些场景下配置和使用Log4j。 7. **Plugins**:Log4j 2支持插件系统,允许开发人员创建...

    log4javascript-1.3.1

    4. **性能优化**:考虑到前端性能,log4javascript在生产环境中可以轻松禁用或调整日志级别,避免对用户体验造成影响。 5. **易用性**:集成log4javascript到项目中简单直观,只需几行代码即可快速启用日志记录功能...

    Log4Net SDK

    它会解释如何创建Logger实例,设置日志级别,以及如何在代码中插入日志语句。此外,还会介绍如何使用XML配置文件进行动态配置,使得在不重启应用的情况下改变日志行为成为可能。 3. **SDK**: SDK文档提供了详细的...

    新闻+log4+ajax+dwr+延时获取.rar

    首先,Log4j是一个广泛应用的日志记录框架,主要在Java开发环境中使用。它提供了灵活的日志记录功能,允许开发者根据需求调整日志级别,从而帮助调试和监控应用程序。Log4j的核心组件包括Logger(记录器)、Appender...

    PowerDesigner11

    - **动态配置**:通过配置文件(如log4j.properties)来调整日志记录的行为,无需重新编译应用程序。 #### 使用步骤 1. **下载与安装**: - 访问官方文档页面...

    log4javascript-开源

    通过使用log4javascript,开发者可以更好地调试代码,跟踪错误,以及在生产环境中收集有价值的应用运行信息。 ### 主要特性 1. **多级别的日志记录**:log4javascript支持多种日志级别,包括TRACE、DEBUG、INFO、...

    将Logback日志输出到websocket

    4. **可定制日志格式**:Logback支持自定义日志格式,这意味着你可以根据需求调整日志输出的样式,包括时间戳、级别、线程名、类名、消息等内容,以满足不同的分析和展示需求。 在“logback-websocket”这个压缩包...

    java日志处理类,CSS表格样式

    这意味着你可以通过SLF4J API编写代码,然后在运行时选择实际的日志实现(如Logback或Log4j)。这提供了更好的可移植性和灵活性。 3. **Java Util Logging (JUL)**:这是Java标准库自带的日志系统,虽然功能相对...

    Struts2调试方法

    log4j.logger.org.apache.struts2=DEBUG ``` 3. **断点调试**:在IDE如Eclipse或IntelliJ IDEA中,可以在Action类、拦截器、业务逻辑等关键位置设置断点。当程序执行到断点时,可以查看变量值、调用堆栈,甚至...

    10422056.rar_Jsp/Servlet_Java_

    此外,Apache Log4j等第三方库提供了更高级的日志管理和配置功能,如日志级别动态调整、日志输出格式定制等。 综上所述,Jsp/Servlet与Java技术在文件管理系统中的应用涉及文件上传、查询、权限控制和日志管理等多...

Global site tag (gtag.js) - Google Analytics