Logback 条件“isDefined”appender 创建不起作用

问题描述

我的 logback.xml 中有类似以下内容(我已将其简化为相关部分):

  <if condition='isDefined("REQUEST_LOG_DIR")'>
    <then>
      <appender name="requests" class="ch.qos.logback.core.FileAppender">
        <file>${REQUEST_LOG_DIR}/requests.log</file>
        <encoder><pattern>%msg%n</pattern></encoder>
      </appender>
    </then>
  </if>

  <logger name="application.requests" additivity="false" level="INFO">
    <if condition='isDefined("REQUEST_LOG_DIR")'>
      <then>
          <appender-ref ref="requests" />
      </then>
    </if>
  </logger>

如果我在定义了 REQUEST_LOG_DIR 的情况下运行我的应用程序,它会按预期工作:我记录到此记录器的消息最终会在 ${REQUEST_LOG_DIR}/requests.log 中。

但是,如果我在未定义 REQUEST_LOG_DIR 的情况下运行我的应用程序,它最终会创建一个 REQUEST_LOG_DIR_IS_UNDEFINED 目录,其中包含一个空的 requests.log 文件

文件保持为空的事实表明,当 REQUEST_LOG_DIR 未定义时,第二条条件逻辑按预期工作,不会将附加程序添加到记录器。

但是,我不明白为什么要创建目录。如果 REQUEST_LOG_DIR 未定义(显然是,给定目录的名称),那么第一个条件应该是阻止 FileAppender 被实例化。

解决方法

那个FileAppender is not lazy。有一些方法可以部分解决这个问题。

您可以将文件包装成:

 <appender name="wrapper" class="ch.qos.logback.classic.sift.SiftingAppender">

  ....

我记得有些时候我不喜欢这个,但现在想不起来了。