log4j 支持环境变量吗

log4j 支持环境变量吗,第1张

修改 log4j 代码 以支持在 log4j.properties 设置环境变量

http://logging.apache.org/site/binindex.cgi

对源码进行浏览后,估计需要修改的文件应该是

src\java\org\apache\log4j\helpers\OptionConverter.java

在这个文件可以看到,log4j 对 ${} 这种形式的变量会进行以下转换

// first try in System properties

String replacement = getSystemProperty(key, null)

// then try props parameter

if(replacement == null &&props != null) {

replacement = props.getProperty(key)

}

就是说,会先从系统变量中读取属性值,如果系统变量不存在这个属性,就从log4j配置文件中属性中读取.

问题就在这里了!

并没有从环境变量中读取,因此,增加一个函数:

public

static

String getEnvProperty(String key, String def) {

try {

String value = System.getenv(key)

if (value == null)

value = def

return value

} catch(Throwable e) { // MS-Java throws com.ms.security.SecurityExceptionEx

LogLog.debug("Was not allowed to read system property \""+key+"\".")

return def

}

}

是的,通过调用 System.getenv() ,就可以从环境变量中读取属性值了.

再修改刚才的代码

// first try in System properties

String replacement = getSystemProperty(key, null)

// then try in environment properties

if (replacement == null)

{

replacement = getEnvProperty(key, null)

}

// then try props parameter

if(replacement == null &&props != null) {

replacement = props.getProperty(key)

}

ok, 代码修改工作完毕, 现在需要编译了.(当然,你需要先安装 ant 和 java. 以后我贴相应的安装文档出来.)

在 logging-log4j-1.2.11 目录下输入

ant

会提示要加参数,所以改为输入

ant build

编译通过,但发现有其它问题,不过不要紧了,已经有这个文件就可以了

logging-log4j-1.2.11\dist\classes\org\apache\log4j\helpers\OptionConverter.class

要正常生成 jar 文件,可能需要其它库文件支持,但不是我研究的方向了.

我只要把这个 OptionConverter.class 放到 log4j-1.2.11.jar 文件里, 替换掉旧的 OptionConverter.class 就可以了.

howto? easy job. 用 winrar 打开 log4j-1.2.11.jar, 用新的 OptionConverter.class 覆盖掉旧的, done!

最后一步, 把这个新的log4j-1.2.11.jar 布署到你的系统中,就可以了.

或者改一个名字? log4j-1.2.11-pro.jar ? 增强版~ 咔咔, well done!

1. 动态的改变记录级别和策略,不需要重启Web应用,如《Effective Enterprise Java》所说。 2. 把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。因为 系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了.log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log 3. 可以把log4j.properties和其他properties一起放在/WEB-INF/ ,而不是Class-Path。 4.log4jRefreshInterval为60000表示 开一条watchdog线程每60秒扫描一下配置文件的变化 在web.xml 添加 <context-param><param-name>log4jConfigL


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/11901382.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存