问题描述
我的 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">
....
我记得有些时候我不喜欢这个,但现在想不起来了。