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. **稳定性与兼容性**:Log4j 1.2.15是一个稳定版本,修复了前一版本中的多个已知问题,确保了与其他系统的良好兼容性。 2. **配置灵活性**:通过配置文件(通常为log4j.properties或log4j.xml),开发者可以灵活...
总结,Apache Log4j 1.2.15是一个强大而灵活的日志解决方案,它提供了丰富的配置选项和易于使用的API,帮助开发者更好地监控和调试应用程序。通过理解其核心组件、配置方法以及在代码中的使用,我们可以更有效地利用...
log4j 1.2.15是该系列的一个稳定版本,虽然现在已有更新的log4j 2.x版本,但1.2.x系列仍然被许多遗留系统所采用。 二、核心组件 1. **Logger**: log4j的核心类,负责接收日志信息并决定如何处理。Logger通过继承...
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都将是一项宝贵的技能。
标题中的"apache-log4j-1.2.15.jar"指的是Log4j的一个特定版本,即1.2.15。这个版本发布于2007年,是Log4j 1.x系列的一个较旧版本,可能不包含一些较新版本的安全更新和性能优化。 Log4j的核心功能包括: 1. **...
Apache Log4j是Java平台上的一个著名日志记录框架,其1.2.15版本是该框架的一个历史版本。Log4j为开发者提供了一种灵活且强大的机制,用于记录应用运行过程中的各种事件和诊断信息。这个文档集合是Log4j 1.2.15版本...
Log4j是Apache组织开发的一款广泛使用的Java日志框架,版本1.2.15是其历史的一个稳定版本。这个源码包包含了Log4j的核心组件和相关配置,便于开发者研究其内部工作原理,理解日志处理机制,以及进行定制化开发。 1....
1. **配置Log4j**:需要创建一个`log4j.properties`或`log4j.xml`文件来指定日志级别(如DEBUG、INFO、WARN、ERROR等)、输出目的地(控制台、文件、邮件等)和日志格式。 2. **导入依赖**:确保你的项目正确地包含...
apache-log4j-1.2.15
log4j_1.2.15 API chm版本
Log4j 1.2.15是该框架的一个较旧版本,发布于2009年,尽管如此,它仍然被许多遗留系统广泛使用。这个zip文件"apache-log4j-1.2.15.zip"包含了Log4j 1.2.15的所有组件和资源,便于开发者集成到他们的项目中。 1. **...
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
log4net是Apache软件基金会的一个开源项目,提供了一个强大的、灵活的日志记录框架,适用于.NET Framework。本文将详细介绍log4net-1.2.15组件包的安装、配置以及如何在C#项目中进行使用。 **一、安装log4net组件包...