`
lixjluck
  • 浏览: 104602 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Log4j 1.2.15路径替换一个bug

阅读更多

    Log4j提供了一个路径替换(subst-mechanism)功能,可以实现运行期替换log4j配置文件里${xx}的标记为外部指定的值。
    例如:log4j.xml可以指定file的值为"${loggingRoot}/project.log",此时就可以利用log4j的subst功能,把${loggingRoot}替换成具体的路径,如d:/app/logs

<appender name="PROJECT" class="log4j.DailyRollingFileAppender">
        <param name="file" value="${loggingRoot}/project.log"/> 
<param name="append" value="true"/> 
<param name="encoding" value="GBK"/>
        <param name="threshold" value="info"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
        </layout>
</appender>

 

 

    那怎么在自己的应用里实现呢? 我们看看org.apache.log4j.xml.DOMConfigurator的类图,发现它提供了一个protected String subst()方法,protected是一个很好的暗示,它暗示着我们可以重载此方法,用自己的props。看看自己写的类吧:

 

    log4j的DOMConfigurator的subst实现

/**
     * Substitutes property value for any references in expression.
     *
     * @param value value from configuration file, may contain
     *              literal text, property references or both
     * @return evaluated expression, may still contain expressions
     *         if unable to expand.
     */
    protected String subst(final String value) {
        try {
            //props是DOMConfigurator的一个成员变量
            return OptionConverter.substVars(value, props);
        } catch (IllegalArgumentException e) {
            LogLog.warn("Could not perform variable substitution.", e);
            return value;
        }
    }

 

 

 

public class DOMConfigurator extends org.apache.log4j.xml.DOMConfigurator {
    private Properties props;

    /**
     * 创建新对象。
     */
    public DOMConfigurator() {
        this(null);
    }

    /**
     * 创建新对象。
     *
     * @param props 可在配置文件中被引用的属性
     */
    public DOMConfigurator(Properties props) {
        this.props = props;
    }
    
    /**
     * 使用XML文件配置log4j。
     *
     * @param filename 配置文件名
     * @param props 可在配置文件中被引用的属性
     */
    public static void configure(String filename, Properties props) {
        new DOMConfigurator(props).doConfigure(filename, LogManager.getLoggerRepository());
    }
    /**
     * 设置属性,这些属性可以在配置文件中被引用。
     *
     * @param props 属性
     */
    public void setProperties(Properties props) {
        this.props = props;
    }

    /**
     * 替换字符串值,将其中的${xxx}替换成具体的值。
     *
     * @param value 要替换的值
     *
     * @return 替换后的值
     */
    protected String subst(String value) {
        try {
            return OptionConverter.substVars(value, props);
        } catch (IllegalArgumentException e) {
            LogLog.warn("Could not perform variable substitution.", e);
            return value;
        }
    }
}

 

 

   忽然某一天,你发现这个功能不能用了,想了半天,哪也没改吗? 没办法,Debug吧,找问题根源的利器,最后你发现别人升级了log4j的版本,log4j 1.2.15。 那就对了,这是log4j-1.2.15的一个bug,它导致了路径替换功能的失效,因为1.2.15版本的DOMConfigurator又提供了一套static的方法实现,如下面为它的代码:

protected  void setParameter(Element elem, PropertySetter propSetter) {
      //调用static方法,这里的props变成了log4j内部DOMConfigurator的成员变量,它现在是null
      setParameter(elem, propSetter, props);
  }
 public static void setParameter(final Element elem, final PropertySetter propSetter, final Properties props) {
        //传递props到static subst,到此路径替换就失效了
     String name = subst(elem.getAttribute("name"), props);
        String value = (elem.getAttribute("value"));
        value = subst(OptionConverter.convertSpecialChars(value), props);
        propSetter.setProperty(name, value);
}

public static String subst(final String value, final Properties props) {
        try {
            return OptionConverter.substVars(value, props);
        } catch (IllegalArgumentException e) {
            LogLog.warn("Could not perform variable substitution.", e);
            return value;
        }
}

 

  在1.2.16后的版本已经解决了此问题,官网还有此bug的记录:https://issues.apache.org/bugzilla/show_bug.cgi?id=43325

   Log4j的路径替换很好用,有点类似它内置的MDC功能,从而帮助我们分离开发、生产环境的配置。

 

----以下无内容----

分享到:
评论
1 楼 futurep_p 2010-08-12  
用maven的profile来管理各个环境的配置不是更好?

相关推荐

    log4j-1.2.15.jar

    1. **稳定性与兼容性**:Log4j 1.2.15是一个稳定版本,修复了前一版本中的多个已知问题,确保了与其他系统的良好兼容性。 2. **配置灵活性**:通过配置文件(通常为log4j.properties或log4j.xml),开发者可以灵活...

    log4j 1.2.15

    总结,Apache Log4j 1.2.15是一个强大而灵活的日志解决方案,它提供了丰富的配置选项和易于使用的API,帮助开发者更好地监控和调试应用程序。通过理解其核心组件、配置方法以及在代码中的使用,我们可以更有效地利用...

    log4j 1.2.15 源码

    log4j 1.2.15是该系列的一个稳定版本,虽然现在已有更新的log4j 2.x版本,但1.2.x系列仍然被许多遗留系统所采用。 二、核心组件 1. **Logger**: log4j的核心类,负责接收日志信息并决定如何处理。Logger通过继承...

    Log4j-1.2.15.chm

    Log4j 1.2.15 api Log4j 1.2.15 api Log4j 1.2.15 api Log4j 1.2.15 api Log4j 1.2.15 api Log4j 1.2.15 api

    log4j-1.2.15

    《深入解析log4j-1.2.15:源码...总的来说,log4j-1.2.15是一个强大的日志框架,其源码的深度研究和合理利用,能够极大地提升开发和运维的效率。无论是在项目开发还是系统维护中,熟练掌握log4j都将是一项宝贵的技能。

    apache-log4j-1.2.15.jar

    标题中的"apache-log4j-1.2.15.jar"指的是Log4j的一个特定版本,即1.2.15。这个版本发布于2007年,是Log4j 1.x系列的一个较旧版本,可能不包含一些较新版本的安全更新和性能优化。 Log4j的核心功能包括: 1. **...

    Apache Log4j 1.2.15 Doc

    Apache Log4j是Java平台上的一个著名日志记录框架,其1.2.15版本是该框架的一个历史版本。Log4j为开发者提供了一种灵活且强大的机制,用于记录应用运行过程中的各种事件和诊断信息。这个文档集合是Log4j 1.2.15版本...

    Log4j_1.2.15 源码

    Log4j是Apache组织开发的一款广泛使用的Java日志框架,版本1.2.15是其历史的一个稳定版本。这个源码包包含了Log4j的核心组件和相关配置,便于开发者研究其内部工作原理,理解日志处理机制,以及进行定制化开发。 1....

    slf4j1.5.8,log4j1.2.15

    1. **配置Log4j**:需要创建一个`log4j.properties`或`log4j.xml`文件来指定日志级别(如DEBUG、INFO、WARN、ERROR等)、输出目的地(控制台、文件、邮件等)和日志格式。 2. **导入依赖**:确保你的项目正确地包含...

    apache-log4j-1.2.15

    apache-log4j-1.2.15

    log4j_1.2.15 API chm版本

    log4j_1.2.15 API chm版本

    apache-log4j-1.2.15.zip

    Log4j 1.2.15是该框架的一个较旧版本,发布于2009年,尽管如此,它仍然被许多遗留系统广泛使用。这个zip文件"apache-log4j-1.2.15.zip"包含了Log4j 1.2.15的所有组件和资源,便于开发者集成到他们的项目中。 1. **...

    log4j-1.2.15-apidocs.rar

    Log4j 1.2.15是1.x系列的一个稳定版本,虽然现在已经有Log4j 2.x版本,但1.2.x系列仍被广泛使用。 二、主要组件 1. **Logger**:日志记录器是Log4j的核心,它是整个日志系统的入口。每个应用程序可以有多个Logger...

    com.springsource.org.apache.log4j-1.2.15.jar

    com.springsource.org.apache.log4j-1.2.15.jar

    log4net-1.2.15组件包及使用教程(c#编程)

    log4net是Apache软件基金会的一个开源项目,提供了一个强大的、灵活的日志记录框架,适用于.NET Framework。本文将详细介绍log4net-1.2.15组件包的安装、配置以及如何在C#项目中进行使用。 **一、安装log4net组件包...

Global site tag (gtag.js) - Google Analytics