我的公司有一个环境管理工具,使您能够以编程方式在Java中查找环境中的属性.我想利用这个工具来配置logback.例如,假设我有一个logback.xml,如下所示(特别是文件appender部分):
<?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>
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,我想LOG_FILE从环境(或OS,如果你愿意)查找属性,并在logback加载logback.xml之前将其传递给logback,以便它知道值LOG_FILE.那么,我该如何实现呢?顺便说一句,我知道如何以编程方式定义文件追加器,但这不是我想要的.
非常感谢你.
Ale*_*tos 15
定义属性中logback.xml,并加载到"上下文":
<property scope="context" name="logfolder" value="${location.of.the.log.folder}" />
Run Code Online (Sandbox Code Playgroud)
然后定义引用属性的appender:
<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>
Run Code Online (Sandbox Code Playgroud)
从文档:
具有上下文范围的属性将插入上下文中,并且只要上下文或直到它被清除就会持续.一旦定义,上下文范围中的属性就是上下文的一部分.因此,它可用于所有日志记录事件,包括通过序列化发送到远程主机的事件.
所以默认范围,即"本地"可能就足够了.
ant*_*tak 10
我想
LOG_FILE从环境(或操作系统,如果你愿意)查找属性
如果是环境,你的意思是通常所说的环境变量,你可以直接在配置文件中引用它们而不会有太多麻烦.
如果您不是指环境变量,而是需要自定义代码来访问的内容,则可以实现一个自定义的ch.qos.logback.core.spi.PropertyDefiner来获取并返回该值.
例如
public class MyCompanyEnvironmentGrabber extends PropertyDefinerBase {
@Override
public String getPropertyValue() {
return ...; // grab the value from company environment
}
}
Run Code Online (Sandbox Code Playgroud)有明显的报告可以logback.xml通过在任何调用之前将其置于加载之前以编程方式设置变量logger,并注意ClassLoader加载顺序......但是,我认为这非常脆弱,因为不使用static logger非常难以控制何时代码库变得复杂.
总而言之,因为logback.xml几乎在Java实例启动后立即加载,将值动态设置为变量的安全方式似乎仅限于:
-D)将其设置在Java程序之外,例如通过调用shell脚本.ch.qos.logback.core.spi.PropertyDefiner回调返回它.ch.qos.logback.classic.spi.LoggerContextListener在这个答案为已完成.logback.xml OP在他的回答中的表现.