我想我很亲近。在我的Java应用程序中使用Logback
在我的logback.xml文件中,我有
<property name="WorkStationID" value="B0094882" />
现在我尝试更改以从主线程设置该值,如此
try {
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator jc = new JoranConfigurator();
jc.setContext(context);
context.reset();
context.putProperty("WorkStationID", "GotIt");
jc.doConfigure("/Users/logback.xml");
} catch (JoranException ex) {
logger.error("init logging failed", ex);
}
但尽管有我的模式
<pattern>%msg ${WorkStationID:-A000000} %n</pattern>
它始终记录B0094882
而不是GotIt
我认为我很接近,但我没有让财产重置。
答案 0 :(得分:2)
这是因为配置文件(本地范围)中定义的属性优先于上下文范围中定义的属性。关注this文档链接。
可以在上下文中定义属性以插入本地范围 范围或系统范围。本地范围是默认值。虽然是 可以从OS环境中读取变量,这是不可能的 写入OS环境。
LOCAL SCOPE具有本地范围的属性 在配置文件中定义直到结束 解释/执行所述配置文件。作为推论, 每次解析和执行配置文件时,变量都在 本地范围是重新定义的。
上下文范围具有上下文范围的属性将插入到 上下文和持续时间只要上下文或直到它被清除。一旦 已定义,上下文范围中的属性是上下文的一部分。因此, 它可用于所有日志记录事件,包括发送到远程事件的事件 主机通过序列化。
SYSTEM SCOPE将具有系统范围的属性插入到JVM中 系统属性,只要JVM或清除它就会持续。
首先在上下文中在本地范围中查找属性 范围第二,在系统属性范围第三,以及在OS中 环境最后。在替换期间,查找属性 本地范围首先,在上下文范围第二,在系统中 属性范围第三,在OS环境中第四个也是最后一个。
作为workaround,你可以在logback.xml中添加它
<if condition='isNull("aProperty")'>
<then><property name="aProperty" value="aValue" /></then>
</if>
如果未定义aProperty系统属性,则将在本地范围内使用您选择的值定义aProperty。