在Log4J 2配置中如何在查询中使用多个替换?可能吗?

时间:2019-07-10 08:49:09

标签: configuration log4j

我遇到一种情况,我希望 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>

我不确定如何在配置的${env:LOG_DIR}属性中同时获取 ${sys:catalina.base}LOG_DIR选项(在默认{ {1}})。如果没有编程解决方案,这是否有可能? (我想避免使用编程解决方案,因为此配置将是多个项目的模板,其中一些项目是SE应用程序中的库。我想避免包括仅用于配置logs的库。 )据我所知,默认设置之前只能进行一次查找。我不知道是否允许嵌套或链接。

2 个答案:

答案 0 :(得分:0)

今天,我遇到了同样的问题,偶然发现了这个问题。我尽了自己的努力,成功地解决了该问题并取得了预期的结果。

<Property name="LOG_DIR">${env:LOG_DIR:-${sys:catalina.base:-/logs}}/somexyz.log</Property>

sys:代表系统环境变量,适用于整个PC或您的当前用户。

env:是在Intellij或类似程序中的运行器中配置的运行时环境变量。

根据log4J2 lookup官方网站:查找的一般格式为${sys:SOME_SYS_PATH:-default_path}${env:SOME_ENV_PATH:-default_path}

  

现在按照您的要求,您想查看文件路径是否为   是否在运行时环境中配置,如果是,则保存所有日志   那个地方的事件数据。如果在运行时未配置文件   环境,然后查找系统环境(如果已配置路径)   然后保存所有日志记录信息,然后保存所有日志记录   信息到默认路径,即/logs

使用以下代码,它将对您有用。

<Property name="LOG_DIR">${env:LOG_DIR:-${sys:catalina.base:-/logs}}/somexyz.log</Property>

如果在运行时环境中配置了文件路径,则将其保存在此,否则,请检查是否在系统环境(PC)中配置了路径并将其保存在该文件中,否则将其保存在默认路径 / logs

答案 1 :(得分:0)

上一个答案确实正确地指出了一个查找表达式可以用作另一个查找表达式中的默认值。我的要求是允许配置驻留在 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 中加入了一个后备配置。