2010-04-13 88 views
2

比方說,我有相同的log4net的文件3個SMTP追加程序,其名稱是:動態log4net appender的名字?

<appender name = "emailDevelopment".. /> 
<appender name = "emailBeta".. /> 
<appender name = "emailProduction".. /> 

比方說,我有3個不同的服務器(開發,測試版,生產)。取決於服務器,我想開啓日誌。在開發服務器的情況下,它會從「emailDevelopment」觸發日誌。我在每個名爲「ApplicationEnvironment」的服務器中有一個系統變量,其值是基於服務器名稱的Development,Beta,Production。現在,無論如何,我可以在log4net中設置root,以便根據服務器名稱觸發電子郵件。

<root> 
     <priority value="ALL" />   
     <appender-ref ref="email<environment name from whose appender should be used>" />  
</root> 

回答

1

即使寫過的唯一XSD file for log4net configuration我仍然不知道一個簡單的方法來實現這一目標後。

你也許能夠做一些事情,如:「%產權(東道國)」

要進行濾波,你將需要:

log4net.GlobalContext.Properties["host"] = new ClassThatToStringsHost(); 

class ClassThatToStringsHost 
{ public override string ToString() { return "whatever"; } } 

現在你可以從日誌格式引用此值在適配器中使用過濾器配置:

<appender name="file" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.PropertyFilter"> 
    <Key value="host" /> 
    <StringToMatch value="whatever" /> 
    </filter> 

    <!-- Anything not accepted by the above should be excluded --> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

甚至可能有一個內置屬性,您可以利用,這應該工作。另見這篇文章:http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

對於我,我自己和我......我會以另一種方式將它們聯繫在一起。我將從默認值和ActivateOptions()方法中派生出我自己的SMTP appender,並根據環境配置值。這將允許您使用一個具有一致規則的SMTP appender,但爲要發送的每個電子郵件地址提供三個公共屬性。這並不難,試試吧!

4

這不會直接回答你的問題,但另一種方法是簡單地有多個log4net配置文件,並在右邊調用XmlConfigurator.Configure()。例如,您可能有Logging.Development.ConfigLogging.Beta.Config等。

在代碼的某處,您可以確定「環境」並使用所需的文件進行配置。

我甚至已經擁有多個配置文件,並將它們的不同部分放到代表「真實」配置的單個XML中,然後調用Configure()方法。例如,Logging.Appenders.Config其中包含所有appender,並將它們全部取出,並將其與上面的一個特定於環境的配置文件結合使用;特定環境的只是簡單地引用他們需要的內容,而其餘的則是針對該環境的非活動/未引用的。