log4j2.xml 属性 替换 ${ } 在 WebLogic 12.2.1 中不起作用

log4j2.xml property substitution ${ } not working in WebLogic 12.2.1

我在 WebLogic 12.2.1 上有 JAX-RS Web 服务 运行。 Web 服务使用 log4j2 进行日志记录,到目前为止它能够记录到 log4j2.xml 中指定的日志文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Properties>
        <Property name="log-path">E:/MLM/MLMDomain/servers/MLMAppSrv01/logs</Property>
    </Properties>
    <Appenders>
        <RollingFile name="RollingFile" fileName="${log-path}/MLMServices.log" filePattern="${log-path}/MLMServices-%d{yyyy-MM-dd}-%i.log" >
    ....

接下来,我没有对托管服务器名称 "MLMAppSrv01" 进行硬编码,而是使用“${weblogic.Name}”将其更改为 属性 替换,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <Properties>
        <Property name="log-path">E:/MLM/MLMDomain/servers/${weblogic.Name}/logs</Property>
    </Properties>
    <Appenders>
        <RollingFile name="RollingFile" fileName="${log-path}/MLMServices.log" filePattern="${log-path}/MLMServices-%d{yyyy-MM-dd}-%i.log" >
    ....

现在,log4j2 没有将 ${weblogic.Name} 替换为实际的 WebLogic 服务器名称,而是简单地将 ${weblogic.Name} 视为实际的子文件夹名称,所以我最终得到了我的在文件夹中创建的日志文件:

E:/MLM/MLMDomain/servers/${weblogic.Name}/logs

在 Web 服务代码中,当我使用 System.getProperty("weblogic.Name") 时,我能够获得应用程序 运行 所在的实际托管服务器,即 "MLMAppSrv01"。所以说明"weblogic.Name"确实是在JVM中定义的

当我在独立程序中使用修改后的 log4j2.xml 文件时,传入 -Dweblogic.Name=MLMAppSrv01,它工作正常并且文件创建于:

E:/MLM/MLMDomain/servers/MLMAppSrv01/logs

log4j2.xml 中的 ${} 在 WebLogic 中不起作用的原因可能是什么?

提前致谢。

如果变量指定为系统 属性 那么您需要使用 ${sys:weblogic.Name} 以便 Log4j 将使用 SystemPropertiesLookup 来解析变量。否则,您将只能访问属性部分中声明的变量。