如何在 Log4J 2 配置的查找中使用多个替换?可能吗?
How do I use Multiple Substitutions in Lookups for Log4J 2 configurations? Is it possible?
我有一种情况,我希望 Log4J 2 确定使用哪个目录进行日志记录。伪代码如下:
property LOG_DIR = "./logs" // default
if (isDIR(${env:LOG_DIR}) {
LOG_DIR = "${env:LOG_DIR}"
} else if (isDir(${sys:catalina.base}) {
LOG_DIR = "${sys:catalina.base}/logs"
}
我的属性配置(在log4j2.xml
中)如下:
<Configuration status="DEBUG">
<Properties>
<Property name="LOG_DIR">${sys:catalina.base}/logs:-logs</Property>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %t/%c:%L | %m%n</Property>
<Property name="JAVA_HEADER">${java:version} - ${java:os}</Property>
</Properties>
<!-- Other configuration here -->
</configuration>
我认为应该是这样的:
<!-- Is this permitted? What happens if there's no Catalina Base AND no LOG_DIR env var? -->
<Property name="LOG_DIR">${env:LOG_DIR}:${sys:catalina.base}/logs:-logs</Property>
我不确定的是如何在 LOG_DIR
属性 中获得 ${env:LOG_DIR}
和 ${sys:catalina.base}
选项] 在配置中(在 logs
的默认值之前)。如果没有程序化解决方案,这甚至可能吗? (我想避免编程解决方案,因为此配置将成为多个项目的模板,其中一些是 SE 应用程序中的库。我想避免包含仅用于配置 Log4J
的库。 ) 据我所知,default之前只能查找一次。我不知道是否允许嵌套或链接。
今天,我遇到了同样的问题,我偶然发现了这个问题。我自己尝试过,成功地解决了问题并达到了预期的结果。
<Property name="LOG_DIR">${env:LOG_DIR:-${sys:catalina.base:-/logs}}/somexyz.log</Property>
sys: 代表系统环境变量,这适用于整个PC或您当前的用户。
env: 是运行你在Intellij或者类似的运行ner中配置的时间环境变量。
根据log4J2 lookup官网:Lookup的一般格式为${sys:SOME_SYS_PATH:-default_path}
或${env:SOME_ENV_PATH:-default_path}
.
Now as per your requirement, You want to see if a file path is
configured in runtime environment or not, if yes then save all logs
event data at that place. If no file is configured in runtime
environment then look for system environment, if path is configured
there then save all logging information there else save all logging
information to a default path i.e /logs
.
使用下面的代码,它会为你工作。
<Property name="LOG_DIR">${env:LOG_DIR:-${sys:catalina.base:-/logs}}/somexyz.log</Property>
如果文件路径是在运行时间环境下配置的就保存在那里,否则检查路径是否在系统环境(PC)配置并保存在那里,否则保存在默认路径/logs.
前面的回答确实正确地指出了一个查找表达式可以用作另一个查找表达式中的默认值。我的要求是允许配置驻留在 WEB-INF 之外,并为此允许两个不同的位置。幸运的是,这也适用于 web.xml 配置:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>file:///${sys:myapp.home:-${sys:user.home}}/myapp/log4j2.xml</param-value>
</context-param>
如果系统 属性 myapp.home 未设置,将使用 user.home 代替。这会否决默认位置 (WEB-INF/log4j2.xml)。如果指示的文件不存在,则只剩下对类路径的搜索。所以我将后备配置放入 WEB-INF/classes.
我有一种情况,我希望 Log4J 2 确定使用哪个目录进行日志记录。伪代码如下:
property LOG_DIR = "./logs" // default
if (isDIR(${env:LOG_DIR}) {
LOG_DIR = "${env:LOG_DIR}"
} else if (isDir(${sys:catalina.base}) {
LOG_DIR = "${sys:catalina.base}/logs"
}
我的属性配置(在log4j2.xml
中)如下:
<Configuration status="DEBUG">
<Properties>
<Property name="LOG_DIR">${sys:catalina.base}/logs:-logs</Property>
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %t/%c:%L | %m%n</Property>
<Property name="JAVA_HEADER">${java:version} - ${java:os}</Property>
</Properties>
<!-- Other configuration here -->
</configuration>
我认为应该是这样的:
<!-- Is this permitted? What happens if there's no Catalina Base AND no LOG_DIR env var? -->
<Property name="LOG_DIR">${env:LOG_DIR}:${sys:catalina.base}/logs:-logs</Property>
我不确定的是如何在 LOG_DIR
属性 中获得 ${env:LOG_DIR}
和 ${sys:catalina.base}
选项] 在配置中(在 logs
的默认值之前)。如果没有程序化解决方案,这甚至可能吗? (我想避免编程解决方案,因为此配置将成为多个项目的模板,其中一些是 SE 应用程序中的库。我想避免包含仅用于配置 Log4J
的库。 ) 据我所知,default之前只能查找一次。我不知道是否允许嵌套或链接。
今天,我遇到了同样的问题,我偶然发现了这个问题。我自己尝试过,成功地解决了问题并达到了预期的结果。
<Property name="LOG_DIR">${env:LOG_DIR:-${sys:catalina.base:-/logs}}/somexyz.log</Property>
sys: 代表系统环境变量,这适用于整个PC或您当前的用户。
env: 是运行你在Intellij或者类似的运行ner中配置的时间环境变量。
根据log4J2 lookup官网:Lookup的一般格式为${sys:SOME_SYS_PATH:-default_path}
或${env:SOME_ENV_PATH:-default_path}
.
Now as per your requirement, You want to see if a file path is configured in runtime environment or not, if yes then save all logs event data at that place. If no file is configured in runtime environment then look for system environment, if path is configured there then save all logging information there else save all logging information to a default path i.e
/logs
.
使用下面的代码,它会为你工作。
<Property name="LOG_DIR">${env:LOG_DIR:-${sys:catalina.base:-/logs}}/somexyz.log</Property>
如果文件路径是在运行时间环境下配置的就保存在那里,否则检查路径是否在系统环境(PC)配置并保存在那里,否则保存在默认路径/logs.
前面的回答确实正确地指出了一个查找表达式可以用作另一个查找表达式中的默认值。我的要求是允许配置驻留在 WEB-INF 之外,并为此允许两个不同的位置。幸运的是,这也适用于 web.xml 配置:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>file:///${sys:myapp.home:-${sys:user.home}}/myapp/log4j2.xml</param-value>
</context-param>
如果系统 属性 myapp.home 未设置,将使用 user.home 代替。这会否决默认位置 (WEB-INF/log4j2.xml)。如果指示的文件不存在,则只剩下对类路径的搜索。所以我将后备配置放入 WEB-INF/classes.