Java 如何在logback自动加载logback.xml之前定义logback变量/属性?

Java 如何在logback自动加载logback.xml之前定义logback变量/属性?,java,logback,Java,Logback,我的公司有一个环境管理工具,使您能够通过Java编程从环境中查找属性。我想利用这个工具来配置logback。例如,假设我有一个logback.xml,如下所示(尤其是文件appender部分): %d{yyyy-MM-dd/HH:MM:ss.SSS}[%thread]-5级别%logger{20}:%msg%n ${LOG_文件:-/default/LOG/FILE/path %d{yyyy-MM-dd/HH:MM:ss.SSS}[%thread]-5级别%logger{20}:%msg%n

我的公司有一个环境管理工具,使您能够通过Java编程从环境中查找属性。我想利用这个工具来配置logback。例如,假设我有一个logback.xml,如下所示(尤其是文件appender部分):


%d{yyyy-MM-dd/HH:MM:ss.SSS}[%thread]-5级别%logger{20}:%msg%n
${LOG_文件:-/default/LOG/FILE/path
%d{yyyy-MM-dd/HH:MM:ss.SSS}[%thread]-5级别%logger{20}:%msg%n
因此,在本例中,我想从环境(或操作系统,如果愿意的话)中查找
LOG\u文件
属性,并在logback加载logback.xml之前将其传递给logback,以便它知道
LOG\u文件的值。那么,如何实现这一点呢?顺便说一句,我知道如何以编程方式定义文件追加器,但这不是我在这里想要的

非常感谢。

logback.xml
中,并将其加载到“上下文”中:


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

<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>

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


因此,默认的作用域“local”可能就足够了。

在我费尽心思之后,我决定采用以下解决方案

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

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

第三,以编程方式在应用程序代码中配置logback(官方logback文档已经提供了这方面的详细信息)

完成了

我想从环境(或操作系统,如果愿意的话)中查找
LOG\u文件
属性

以下是备选方案:
  • 如果说环境,你指的是通常所说的,你可以不费吹灰之力

  • 如果您不是指环境变量,而是指需要自定义代码才能访问的内容,那么可以使用获取并返回值的方法

    e、 g

  • 有报道称,人们可以在
    logback.xml
    之前以编程方式设置变量,方法是将其放在对
    logger
    的任何调用之前加载,并注意类加载器的加载顺序……然而,我认为这是非常脆弱的,因为当代码库变为comp时,不使用
    静态logger
    很难控制莱克斯

  • 总之,由于几乎在Java实例启动后立即加载
    logback.xml
    ,因此动态设置变量值的安全方法似乎仅限于:

  • 通过使用环境变量或系统属性(
    -D
    ),在Java程序外部设置它,例如通过调用shell脚本
  • 通过
    ch.qos.logback.core.spi.PropertyDefiner
    回调返回它
  • 设置它
  • 人为延迟加载
    logback.xml
  • 试试这个:

    在logback.xml中,通过%Property{myProperty}引用您的属性:

        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %property{myProperty} - %m%n%wEx
            </pattern>
        </encoder>
        </appender>
    

    使用标准的Logback Groovy支持可能是最简单的方法。谢谢,Alexandre。但是,这并不能解决我的问题。我想要
    ${location.of.the.log.folder}
    正如您在logback加载任何配置之前定义的示例一样。我发现在Startup上指定-Dlocation.of.the.log.folder=dir可以起作用。您还可以从
    *.properties
    文件导入所有属性-例如
    Hi JBT。谢谢。我做了一些稍微不同的事情。我将logback xml文件保存在cla中但是我把它命名为“out logback.xml”。一旦它是一个logback无法扫描的名称,我就能够将配置文件保存在jar中。
    <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>
    
    public class MyCompanyEnvironmentGrabber extends PropertyDefinerBase {
    
        @Override
        public String getPropertyValue() {
            return ...; // grab the value from company environment
        }
    }
    
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %property{myProperty} - %m%n%wEx
            </pattern>
        </encoder>
        </appender>
    
    LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
    loggerContext.putProperty("myProperty", "myProperty12345");