根據某些指標(啓動標誌,#if指令,...),我的主應用程序可以從控制檯環境或Windows服務開始。只要應用程序以'生產模式'運行,例如沒有用戶上下文作爲啓動服務,我想同時登錄文件(信息,警告)以及Windows事件日誌。但是,當我在調試時,我只想將日誌消息執行到控制檯窗口。基於log4net中的構建配置的不同appender
有什麼辦法可以使用log4net來實現這一點,它不包括在運行時觸摸應用程序配置?
根據某些指標(啓動標誌,#if指令,...),我的主應用程序可以從控制檯環境或Windows服務開始。只要應用程序以'生產模式'運行,例如沒有用戶上下文作爲啓動服務,我想同時登錄文件(信息,警告)以及Windows事件日誌。但是,當我在調試時,我只想將日誌消息執行到控制檯窗口。基於log4net中的構建配置的不同appender
有什麼辦法可以使用log4net來實現這一點,它不包括在運行時觸摸應用程序配置?
坦白代碼的方法聽起來並不像一個很不錯的主意,我,因爲它隱藏了一些行爲,將在年底管理系統的人。既然你可能有兩種構建配置(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
所有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;
}
您是否有機會嘗試提出的解決方案? – samy