从Java main中更改Logback属性值

时间:2014-12-22 22:01:54

标签: java logback

我想我很亲近。在我的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

我认为我很接近,但我没有让财产重置。

1 个答案:

答案 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。