2014-05-14 177 views
17

有什麼方法可以覆蓋logback配置嗎?我知道我們在名爲logback.xml的文件(通常存儲在路徑src/resources中)中定義了logback配置,並且我知道通過使用<include>標籤,我們可以設置一個外部文件以添加到logback.xml,如下所示:覆蓋logback配置

<configuration> 

<!--<include url="file:///d:/ServerConfig.xml"/>--> 
<include file="${outPut}/ServerConfig.xml"/> 


<logger name="Server" LEVEL="DEBUG"> 
    <appender-ref ref="FILEOUT" /> 
</logger> 

<root level="DEBUG"> 
    <appender-ref ref="STDOUT" /> 
    <!--<appender-ref ref="FILEOUT" />--> 
</root> 

</configuration> 

但是如果我想重寫此默認配置(例如設定根記錄器,級別爲INFO)

這裏的方式是什麼包含的文件:

<included> 

<!-- <property file="d:/ServerSysVar.properties"/>--> 
<property file="${outPut}/ServerSysVar.properties"/> 


<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are assigned the type 
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
</appender> 



<appender name="FILEOUT" class="ch.qos.logback.core.FileAppender"> 
    <file>${Sys_Location}/Serverfile4.log</file> 
    <!-- encoders are assigned the type 
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %class{36}.%M %L CLIENT_PORT:%X{ClientPort}- %msg%n</pattern> 
    </encoder> 
</appender> 


<logger name="Service" LEVEL="DEBUG"> 
    <appender-ref ref="FILEOUT" /> 
</logger> 

<root> 
    <appender-ref ref="STDOUT" /> 
    <!-- <appender-ref ref="FILEOUT" />--> 
</root> 

</included> 
+0

說有就是打算通過重寫配置與系統屬性來解決問題,在2011年報告中的錯誤 - http://jira.qos.ch/browse/LOGBACK- 239 – erkfel

+1

這個討論表明了作者抗拒改變任何一些*學術*廢話的非凡的固執性。我想知道這個實現如何還能活着? – tomasb

回答

17

我不認爲你可以覆蓋logback.xml-來自包含文件的定義。

但是我有解決你的問題就壓倒一切的根記錄器級別,使用variable substitution有默認值的方法:

logback.xml

<configuration> 
    <include file="includedFile.xml" /> 

    <!-- STDOUT appender stuff --> 

    <root level="${root.level:-DEBUG}"> 
    <appender-ref ref="STDOUT" /> 
    </root> 
<configuration> 

includedFile.xml

<included> 

    <!-- override the default value; or comment out to leave it at default --> 
    <property name="root.level" value="INFO" /> 

</included> 

有了這個概念,我甚至能夠從包含的文件中控制輸出到多個appender:

logback.xml

<configuration> 
    <include file="includedFile.xml" /> 

    <!-- STDOUT appender stuff --> 

    <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>${file.level:-ALL}</level> 
    </filter> 
    <file>/path/to/logfeil.log</file> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> 
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> 
     <level>${syslog.level:-OFF}</level> 
    </filter> 
    <syslogHost>localhost</syslogHost> 
    <facility>${syslog.facility:-LOCAL1}</facility> 
    <suffixPattern>${syslog.pattern:-[%thread] %logger{36} - %msg}</suffixPattern> 
    </appender> 

    <logger name="my.package" level="${logging.level:-INFO}" additivity="false"> 
    <appender-ref ref="FILE" /> 
    <appender-ref ref="SYSLOG" /> 
    </logger> 

    <root level="${root.level:-DEBUG}"> 
    <appender-ref ref="STDOUT" /> 
    </root> 
<configuration> 

而在includedFile.xml我能控制的,如果,在什麼層面消息將通過追加程序FILESYSLOG,設置屬性file.levelsyslog.level當然logging.level的和。

2

我有一個類似的問題,這個答案似乎是最好的方法。

在我的情況下,我需要重寫包含的文件以完全關閉其中一個appender。

使用變量作爲日誌級別值,可以將其更改爲OFF。

<included> 
    (...) 
    <root level="${root.level.console:-DEBUG}"> 
    <appender-ref ref="CONSOLE" /> 
    </root> 
    <root level="${root.level.file:-DEBUG}"> 
    <appender-ref ref="FILE" /> 
    </root> 
</included> 

正如http://logback.qos.ch/manual/configuration.html#rootElement

<configuration> 
    <include resource="base.xml" /> 
    (...) 
    <property name="root.level.console" value="OFF" /> 
</configuration> 
+0

這個變體對我不起作用。我使用logback版本1.1.3。你用什麼版本? 至少它不適用於appender的文件標籤。我嘗試覆蓋包含文件的文件名 – Geniy

+0

設置 _ _ 之前 _ _ – Geniy

+0

該文檔說「至多一個元素」,所以如果這能起作用,它可能不是故意的。看起來好像將元素放入您的包含文件中。 – Shannon