2017-05-30 71 views
0

我有兩個不同級別的數據庫的記錄器。我想爲每個記錄器有不同的bufferSize。 一種方法是將兩個appender放在同一個數據庫中,只有bufferSize元素有所不同,但它是複製粘貼。 是否可以擴展已定義的appender並更改它的bufferSize屬性? 例如:log4net appenders與不同緩衝區的數據庫大小

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="20" /> 
     ...other elements 
</appender> 
<appender name="AdoNetAppenderChild" extends="AdoNetAppender"> 
    <bufferSize value="1" /> 
</appender> 

    <logger name="Fatal" additivity="false"> 
    <level value="FATAL"/> 
    <appender-ref ref="AdoNetAppenderChild" /> 
</logger> 
    <logger name="Common" additivity="false"> 
    <level value="INFO"/> 
    <appender-ref ref="AdoNetAppender" /> 
</logger> 

我想避免是一種有兩個附加目的地具有相同的元素和屬性,只有不同的值是BUFFERSIZE

+0

_「它的複製 - 粘貼」 _配置往往是,以及作爲冗長煩人的和重複的。在這種情況下,在配置可能是你最好的選擇,雖然增加了一倍 - 你真的不希望在運行時更改緩衝區大小,唯一的另一種選擇是編寫代碼來複制appender(或創建一個新的等),然後需要記錄,測試等。 – stuartd

+0

謝謝。 還有一個問題,是爲每個MVC控制器配備單個靜態記錄器並在該記錄器中添加會話中的一些額外信息。 具體而言,如果我從會話中放置log4net.LogicalThreadContext。[「sessionVariable」],我可以確定它不會被覆蓋,或者應該在每個請求上創建新的記錄器實例嗎? – Error

+0

我不會對靜態記錄器100%自信。 log4net緩存記錄器,因此在每個請求上創建新的更安全。 – stuartd

回答

0

可以使一個附加器和使用評估,當你有一個登錄錯誤消息:

<evaluator type="log4net.Core.LevelEvaluator"> 
    <threshold value="ERROR"/> 
</evaluator> 

評價者是用於由 BufferingAppenderSkeleton以確定一個可插入的對象,如果日誌記錄事件不應該 被緩衝,而是立即寫入/發送。如果評估者 確定該事件很重要,則當前緩衝區的全部內容將與該事件一起發送。通常情況下,將發送一個 SmtpAppender以在發送之前緩衝事件,因爲發送電子郵件的代價 可能相對較高。如果一個重要的事件 到達,說一個錯誤,我們希望立即交付 ,而不是等待緩衝區變滿。這就是評估者進來的地方,因爲它允許我們說:「當一個重要事件 到達時不用擔心緩衝,只需發送你現在所有的一切。」 。