log4j2中的参数替换

时间:2014-09-16 19:10:28

标签: jndi log4j2

我需要允许部署者为我们的Tomcat webapp log4j2 RollingFileLogger指定路径。我想使用JNDI但是如果必须的话可以使用普通的-D参数。 This apache page似乎很好地解释了事情。

唯一的问题是它不起作用。我承认在JNDI中没有特别的经验,但我甚至无法获得一个简单的JVM参数。阅读Property Substitution我得到的印象是我不能将$$ {jndi:xxxx}放在filename属性中,而是应该使用$ {xxx}属性替换。不幸的是,当财产替代工作正常时,没有查询jndi或env会解决。

log4j2.xml:

    <Properties>
       <Property name="filename">$${jndi:logPath/directory}/ief.log</Property>
    </Properties>
    ....
    <RollingFile name="RollingFileLogger" fileName="${filename}" immediateFlush="false" append="true"

结果:

2014-09-16 14:44:46,284 ERROR Unable to create file ${jndi:logPath/directory}/ief.log java.io.IOException: The filename, directory name, or volume label syntax is incorrect

如您所见,该属性已被替换但查找未完成。我不确定context.xml条目应该是什么样子。但我最好的猜测是:

<Resource name="logPath"
    auth="Container"
    directory="/tmp" />

我正在使用log4j 2.0版,但我相当确定这是我的误解而不是错误。任何帮助清理我做错了什么都将非常感激。

2 个答案:

答案 0 :(得分:1)

我从来没有找到可以在Tomcat 7中运行的JNDI浏览器。但它确实是一个愚蠢的问题。我将其定义为RESOURCE而不是环境。仅为记录,context.xml应如下所示:

<Environment name="logPath"
    auth="Container"
    type="java.lang.String"
    value="/tmp" />

然后log4j2查找:

<Property name="logName">$${jndi:logPath}/iefrest.log</Property>
    <Property name="patternName">$${jndi:logPath}/iefrest</Property>
...
<RollingFile name="RollingFileLogger" fileName="${logName}" immediateFlush="false" append="true"
            filePattern="${patternName}-%d{yyyyMMdd-HH}.log.gz">

值得注意的是&#34; java:comp / env&#34; (这清楚地记录在案,但对那些不具备JNDI知识的人有误导性 - 就像我一样)实际上映射到了Environment XML元素,并没有暗示name属性的前缀。

从Log4J2开始,有趣的是文件名属性是按照提供的方式完全采用的。具体来说,你不能说filename =&#34; $ {logName} .log&#34;。这不会解析为期望的结果。但是,预期的连接将在filepattern属性上进行。不一致但不难以管理。

答案 1 :(得分:0)

如果您指定$${jndi:logPath/directory},则查找将添加前缀java:comp/env/,因此它将查找的完整值为java:comp/env/logPath/directory。 (如果您的jndi查找键已包含':'字符,则不会添加此前缀。)也许您可以使用JNDI浏览器查看是否为您提供了预期值。

此查找期间发生的任何错误都将记录到WARN级别的状态记录器。状态日志显示在控制台中。您可以通过在log4j2.xml配置文件中指定<Configuration status="trace" ...来启用状态日志。