如何在回日志自动加载日志之前定义日志返回变量/属性.xml?

2022-09-01 15:45:30

我的公司有一个环境管理工具,使您能够在 Java 中以编程方式从环境中查找属性。我想利用此工具来配置日志。例如,假设我有一个 logback.xml如下所示(特别是文件追加器部分):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- console appender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
        </encoder>
    </appender>

    <!-- file appender -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${LOG_FILE:-/default/log/file/path</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS} [%thread] %-5level %logger{20}: %msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

因此,在本例中,我想从环境(或操作系统,如果您愿意)中查找该属性,并在 logback 加载 logback 之前将其传递给 logback.xml以便它将知道 的值。那么,我怎样才能做到这一点呢?顺便说一句,我知道如何以编程方式定义文件追加器,但这不是我想要的。LOG_FILELOG_FILE

谢谢。


答案 1

在 中定义一个属性并将其加载到“上下文”中:logback.xml

<property scope="context" name="logfolder" value="${location.of.the.log.folder}" />

然后定义引用该属性的追加器:

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${logfolder}/logfile.log</file>
    <append>true</append>
    <encoder>
        <pattern>[%d{ISO8601}] [%p] [%t] [%c] [%m]%n</pattern>
    </encoder>
</appender>

文档中

具有上下文范围的属性将插入到上下文中,并且一直持续到上下文或直到它被清除为止。定义后,上下文范围内的属性就是上下文的一部分。因此,它可用于所有日志记录事件,包括通过序列化发送到远程主机的事件。

因此,默认范围(即“本地”)可能就足够了。


答案 2

在挠了相当多的头之后,我正在解决以下解决方案。

首先,将 logback.xml类路径外部,以便 logback 不会自动加载任何内容。

其次,将环境中的设置添加到系统属性,以便 logback 可以在解析 logback 时查找它们.xml。

第三,以编程方式在应用程序代码中配置日志。(官方的日志文档有一个很好的例子

做。


推荐