2012-10-31 64 views
9

想法是在不重新部署的情況下更改logback配置。 Slf4j和logback在項目中使用。 logback.xml文件在耳邊,但是它從屬性文件中讀取一些屬性,它放在耳邊。 類似的東西:無需重新部署即可更新logback配置

<configuration scan="true" scanPeriod="5 seconds"> 
<property file="${logconfig}"/> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>${logback.consolePattern}</pattern> 
    </encoder> 
</appender> 
<root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
</root> 

</configuration> 

問題是,掃描檢查logback.xml已更改(和文件總是相同的)。這就是爲什麼在屬性文件中更改值不會更改logback的配置。更改僅在重新部署後應用。

那麼有能力修改logback配置而不重新部署的最好方法是什麼?有沒有一些機制可以實現它?

upd:更改將很少發生。但他們應該儘快應用。表現也很重要。

+1

你不能做編程的一些虛擬的變化logback.xml文件,以便重新加載?像添加和刪除文件末尾的空白行? – rolve

+0

@rolve 我想過這樣的工作。但我希望一定有更方便的方法來做到這一點。 – error1009

回答

0

經過一番比較後,我認爲將logback.xml放在耳邊會更容易也更舒服。 可以通過在服務器配置中指定系統屬性logback.configurationFile來實現。 爲了讓編輯更方便,我打算在文件的開頭定義一些屬性。這樣

<property name="consolePattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> 

然後在配置中使用它們

<pattern>${consolePattern}</pattern> 

它將處理問題的動態變化,它幾乎是用戶友好的))

5

我管理由這樣做是爲了重新加載它:在自動配置之前

loggerContext.putProperty("logDirectory", getLogDirectory().getAbsolutePath()); 

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
loggerContext.reset(); 
ContextInitializer ci = new ContextInitializer(loggerContext); 
ci.autoConfig(); 

在我的使用情況下,我這樣做,邊做邊添加一些屬性的上下文。

從屬性文件讀取屬性也應該起作用。

+0

不幸的是,這需要應用程序代碼知道日誌的實現而不是接口,因爲LoggerContext是一個logback類。這當然假定海報使用slf4j作爲伐木外觀,正如推薦的那樣。 –

+0

所以你建議檢查屬性文件中的更改。並重新加載配置,如果財產被更改? 它應該可以工作,但我認爲它不適合表演。 – error1009

3

也許命令「觸摸」將用於虛擬文件修改後,屬性設置。

相關問題