【问题标题】:Parameter substitution in log4j2log4j2 中的参数替换
【发布时间】:2014-11-10 16:00:06
【问题描述】:

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

唯一的问题是它不起作用。我承认我在 JNDI 方面没有特别的经验,但我什至无法让一个简单的 JVM 参数工作。阅读Property Substitution 我得到的印象是我不能只将 $${jndi:xxxx} 放在文件名属性中,而是应该使用 ${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 版,但我相当肯定这是我的误解,而不是错误。任何帮助清除我做错的事情将不胜感激。

【问题讨论】:

    标签: jndi log4j2


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我从未找到可以在 Tomcat 7 中运行的 JNDI 浏览器。但它确实是一个愚蠢的问题。我将其定义为资源而不是环境。只是为了记录 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">
      

      值得注意的是,“java:comp/env”(有明确的文档记录,但会误导像我这样对 JNDI 没有深入了解的人)实际上映射到 Environment XML 元素,并不意味着name 属性的前缀。

      从 Log4J2 角度来看,文件名属性完全按照提供的方式获取也很有趣。具体来说,您不能说 filename="${logName}.log"。这不会解析为所需的结果。然而,预期的连接确实发生在 filepattern 属性上。不一致但并非无法管理。

      【讨论】:

        猜你喜欢
        • 2021-04-24
        • 1970-01-01
        • 2017-05-17
        • 1970-01-01
        • 2014-03-28
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        • 2013-06-29
        相关资源
        最近更新 更多