log4j动态日志级别调整

摘要:
=null)returnc.level;}是向父级别查找的办法,所以性能无大影响。
1. 针对root logger的设置

log4j.rootLogger=INFO, CONSOLE
Logger.getRootLogger().setLevel(org.apache.log4j.Level.DEBUG)

2. 针对Appender的Appender设置

log4j.appender.CONSOLE.Threshold=DEBUG
((org.apache.log4j.ConsoleAppender)Logger.getRootLogger().getAppender("CONSOLE")).setThreshold(Priority.DEBUG)
注意Appender的转型,用AppenderSkeleton 更好

3. 针对包名设置的日志级别的调整

log4j.logger.org.simonme.log4j.thread=ERROR
Logger.getRootLogger().getLogger("org.simonme.log4j.thread").setLevel(org.apache.log4j.Level.DEBUG);

另:
Logger.getRootLogger().getCurrentCategories(); 能拿到所有logger对象
只是已经是过时api了

再另:
级别无论如何设置,不会超过其父级别
上面 1 2 3 就是按父子顺序的排列的。

再另另:

针对包名的日志级别配置 log4j.logger.org.simonme.log4j.thread=ERROR 是在什么地方处理了这个逻辑 使之生效的

请查看org.apache.log4j.Hierarchy.updateParents(Logger)方法

//System.out.println("UpdateParents called for " + name);

    //if name = "w.x.y.z", loop thourgh "w.x.y", "w.x" and "w", but not "w.x.y.z"
    for(int i = name.lastIndexOf('.', length-1); i >= 0;
                                     i = name.lastIndexOf('.', i-1))  {
      String substr = name.substring(0, i);

      //System.out.println("Updating parent : " + substr);
      CategoryKey key = new CategoryKey(substr); //simple constructor
      Object o =ht.get(key);
      //Create a provision node for a future parent.
      if(o == null) {
    //System.out.println("No parent "+substr+" found. Creating ProvisionNode.");
    ProvisionNode pn = newProvisionNode(cat);
    ht.put(key, pn);
      } else if(o instanceofCategory) {
    parentFound = true;
    cat.parent =(Category) o;
    //System.out.println("Linking " + cat.name + " -> " + ((Category) o).name);
    break; //no need to update the ancestors of the closest ancestor
      } else if(o instanceofProvisionNode) {
    ((ProvisionNode) o).addElement(cat);
      } else{
    Exception e = new IllegalStateException("unexpected object type " +o.getClass() + " in ht.");
    e.printStackTrace();
      }
    }

再另另另:

性能如何

org.apache.log4j.Category.getEffectiveLevel()

for(Category c = this; c != null; c=c.parent) {
      if(c.level != null)
    returnc.level;
    }

是向父级别查找的办法,所以性能无大影响。

免责声明:文章转载自《log4j动态日志级别调整》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇phpcms前台任意代码执行漏洞(php<5.3)OpenStack实战(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

hibernate的各个jar包的作用

最基本的Hibernate3.3.2之 JAR包(必要): 包名 位置 用途 hibernate3.jar /hibernate 核心JAR包 antlr.jar /hibernate/lib/required Another Tool for Language Recognition,可以构造语言识别器,解析HQL需要 commons-c...

http接口 两种调用http接口的方法

import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.htt...

ibatis DTD 2.0 3.0

ibatis 3.0 DTD New sqlMapConfig.xml DTD: <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> New sqlMap (*.m...

Web渗透——web服务器指纹识别

1、概述 Web服务器指纹识别是渗透测试人员非常重要的一个任务。了解正在运行的web服务器类型和版本能让测试者更好去测试已知漏洞和大概的利用方法。 目前市场上存在几种不同的web服务器提供商和软件版本,了解被测试的web服务器的类型,将会在渗透测试过程中有很大的帮助,甚至会改变测试的路线。 你可以通过发送web服务器特定的命令并分析输出结果来得到这些信息,...

shiro启用注解方式

shiro验证权限方式一种是基于url配置文件: 例如: <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityMan...

【转载】Linux系统下源代码包方式安装PHP开发环境

########节选自《细说PHP》################ 2.2 Linux系统下源代码包方式安装环境 在Linux平台下安装PHP有几种方法:使用配置和编译过程,或是使用各种预编译的包。在Linux上安装软件,用户最好的选择是下载源代码包,并编译一个适合自己的版本。LAMP组合中每个成员都是开源的软件,都可以从各自的官方网站上免费下载安装程序...