动态改变log4j的运行级别

本文介绍了一种在不重启应用的情况下动态调整log4j日志级别的方法,包括通过编写Java类和使用JSP页面配合JSTL实现日志级别调整,以及利用Spring框架和JMX进行远程配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Java Annotation手册 JBPM的分配任务的模式:推模式和拉模式

动态改变log4j的运行级别  

 

2009-02-03 10:18:50|  分类: JavaServer Page |字号 订阅

 做一个产品或者项目,在测试时一般要打印详细的log,发布以后,因为打印有效率问题,所以通常将log4j级别设置为最高,以提高效率,一旦客户那里出了问题,要查看详细的日志信息才能确定,因此打印日志就是很重要的事情,但是让客户手工修改log4j配置文件,不是很好的事情。

修改log4j级别

public class Log4jConfig {

 

public void enableInfo(String target){

LogManager.getLogger(target).setLevel(Level.INFO);

}

 

public void enableWarn(String target){

LogManager.getLogger(target).setLevel(Level.WARN);

}

 

public void enableError(String target){

LogManager.getLogger(target).setLevel(Level.ERROR) ;

}

 

public void enableDebug(String target){

LogManager.getLogger(target).setLevel(Level.DEBUG) ;

}

 

}

写个jsp可以很简单的做到,合理使用jstl

 

<%@ page import="org.apache.log4j.*" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ page contentType="text/html;charset=GBK" language="java" %>

<html>

<head><title>Log4J级别控制</title></head>

<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

<body>

<h1>Log4J级别控制</h1>

<% String logName = request.getParameter("log");

    if (null != logName) {

        Logger log = ("".equals(logName) ?

                Logger.getRootLogger() : Logger.getLogger(logName));

        log.setLevel(Level.toLevel(request.getParameter("level"), Level.DEBUG));

    }

%>

<c:set var="rootLogger" value="<%= Logger.getRootLogger() %>"/>

<form>

    <table border="1">

        <tr>

            <th>Level</th>

            <th>Logger</th>

            <th>Set New Level</th>

        </tr>

        <tr>

            <td>${rootLogger.level}</td>

            <td>${rootLogger.name}</td>

            <td>

                <c:forTokens var="level" delims="," items="DEBUG,INFO,WARN,ERROR,OFF">

                    <a href="log4j.jsp?log=&level=${level}">${level}</a>

                </c:forTokens>

            </td>

        </tr>

        <c:forEach var="logger" items="${rootLogger.loggerRepository.currentLoggers}">

            <c:if test="${!empty logger.level.syslogEquivalent || param.showAll}">

                <tr>

                    <td>${logger.level}</td>

                    <td>${logger.name}</td>

                    <td>

                        <c:forTokens var="level" delims="," items="DEBUG,INFO,WARN,ERROR,OFF">

                            <a href="log4j.jsp?log=${logger.name}&level=${level}">${level}</a>

                        </c:forTokens>

                    </td>

                </tr>

            </c:if>

        </c:forEach>

        <tr>

            <td></td>

            <td><input type="text" name="log"/></td>

            <td>

                <select name="level">

                    <c:forTokens var="level" delims="," items="DEBUG,INFO,WARN,ERROR,OFF">

                        <option>${level}</option>

                    </c:forTokens>

                </select> <input type="submit" value="Add New Logger"/></td>

        </tr>

    </table>

</form>

Show <a href="log4j.jsp?showAll=true">所有已知 loggers</a>

</body>

</html>

如果使用spring 2.0和jmx会很简单 [servletname]-servlet.xml配置

<bean id="exporter"

 

     class="org.springframework.jmx.export.MBeanExporter">

 

     <property name="beans">

 

          <map>

 

              <entry key="bean:name=logBean"

 

                   value-ref="/hello.htm" />

 

          </map>

 

     </property>

 

</bean>

spring加入另外的两个配置

<entry key="bean:name=logBean" value-ref="logManager" />

 

<bean name="logManager" class="com.xx.Log4JManager"/>

写入

public class Log4JManager {

 

    public void setLogger(String packageName, String level) {

 

        LogManager.getLogger(packageName).setLevel(Level.toLevel(level));

 

    }

 

}

可以用JConsole 进行控制。

 

典型的log4j配置文件

 

# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!

# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.

log4j.rootLogger=INFO,stdout,logfile

 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n

 

log4j.appender.logfile=org.apache.log4j.RollingFileAppender

log4j.appender.logfile.File=../../MgrWeb/log/mgrweb.log

log4j.appender.logfile.MaxFileSize=1024KB

# Keep three backup files.

log4j.appender.logfile.MaxBackupIndex=20

# Pattern to output: date priority [category] - message

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=%d %p [%c\:%t\:%l] - %m%n

 

 

log4j.logger.org.hibernate.SQL=DEBUG

 

 

 

 

 

 

http://cancait.blog.163.com/blog/static/21335744200913101850280/

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值