2014-06-23 25 views
2

根據某些指標(啓動標誌,#if指令,...),我的主應用程序可以從控制檯環境Windows服務開始。只要應用程序以'生產模式'運行,例如沒有用戶上下文作爲啓動服務,我想同時登錄文件(信息,警告)以及Windows事件日誌。但是,當我在調試時,我只想將日誌消息執行到控制檯窗口。基於log4net中的構建配置的不同appender

有什麼辦法可以使用log4net來實現這一點,它不包括在運行時觸摸應用程序配置?

+0

您是否有機會嘗試提出的解決方案? – samy

回答

3

坦白代碼的方法聽起來並不像一個很不錯的主意,我,因爲它隱藏了一些行爲,將在年底管理系統的人。既然你可能有兩種構建配置(release和debug?),爲什麼不使用它們來代替change the configuration file depending on the build

如果你真的不想這樣做,那麼這裏是如何做到這一點:你可以在你的log4net庫

// declare this code as soon as you've determined what context you're in 
log4net.GlobalContext.Properties["ApplicationMode"] = "Service"; 
// or 'Console", with an #IF directive 

然後在你的log4net的配置的全球範圍內設置的自定義屬性,你可以濾除,將通過您的追加程序使用的log4net的PropertyFilter

爲您的開發控制檯的appender被抓消息:

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender,log4net"> 

    <filter type="log4net.Filter.PropertyFilter"> 
    <key value="ApplicationMode" /> 
    <stringToMatch value="Console" /> 
    <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 

    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date %-5level %-25.25logger{1} - %message%newline" /> 
    </layout> 
</appender> 

一第二爲您的生產

<appender name="FileAppender" type="log4net.Appender.FileAppender,log4net"> 

    <filter type="log4net.Filter.PropertyFilter"> 
    <key value="ApplicationMode" /> 
    <stringToMatch value="Service" /> 
    <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 

    <file value="mylogfile.txt" /> 
    <appendToFile value="true" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 

    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date %-5level %-25.25logger{1} - %message%newline" /> 
    </layout> 
</appender> 

這個文件appender然後宣佈所有附加目的地爲您的日誌:

<root> 
    <level value="DEBUG"/> 
    <appender-ref ref="FileAppender"/> 
    <appender-ref ref="ConsoleAppender"/> 
</root> 

這將派遣你的消息,這取決於那就是在全球屬性的值正確的appender。 DenyAllFilter很重要; log4net的工作原理是默認情況下讓所有消息都通過,而您只希望與您的消息匹配PropertyFilter

0

所有appender都可以編程方式創建,修改或刪除。爲什麼不只是刪除你想避免的appender?這使您可以使用相同的代碼來檢測您正在調試和/或在控制檯中運行。

以編程方式禁用的appender:

log4net.Appender.IAppender[] appenders = log4net.LogManager.GetRepository().GetAppenders(); 

    for (int i = 0; i < appenders.Length; ++i) 
    { 
     Log4net.Appender.FileAppender appender = appenders[i] as log4net.Appender.FileAppender; 
     if (appender != null && appender.Name == "RollingFile") 
       appender.Threshold = log4net.Core.Level.Off; 
    }