Java 如何在logback自动加载logback.xml之前定义logback变量/属性?
我的公司有一个环境管理工具,使您能够通过Java编程从环境中查找属性。我想利用这个工具来配置logback。例如,假设我有一个logback.xml,如下所示(尤其是文件appender部分):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
%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");