[英]Best practices for creating a logger library using log4net. Is
我的目標是創建一個可以跨多個項目共享的log4net庫。
在我的.net 4.0解決方案中,我創建了一個名為Logger的類庫,並從Web項目中引用它。
現在我在類庫中創建了一個logger.config,並將所有配置放在logger.config文件中。 然后我用了
[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "Logger.config")]
當我運行Web應用程序時,沒有任何記錄。 所以我在web.config中添加了這行代碼
<add key="log4net.Internal.Debug" value="true"/>
這給了我調試信息和錯誤信息
無法在應用程序的.config文件中找到配置節'log4net'。 檢查.config文件中的和元素。 配置部分應如下所示:
我將配置從logger.config移動到web.config,一切似乎都正常。
我不想在web.config中使用log4net配置,但將logger.config作為一種更清潔的方法。 目標是使其他項目使用此庫,而不必擔心每個項目中的配置。
現在的問題是,我該怎么做? 我究竟做錯了什么? 任何帶代碼示例的建議都將對每個人都有益。
僅供參考,我正在使用結構圖IOC在登錄之前重新獲得記錄器。
我相信您正在嘗試重新發明輪子,有幾種工具可以從您的代碼中抽象記錄器將記錄器框架與代碼分離:
http://netcommon.sourceforge.net/
這些是.Net應用程序中最常見的。
那么現在如果你堅持使用你自己的抽象(這是有效的),這是我的建議:
首先,我假設你會有類似的東西:
interface ILogger
{
void Debug(string message);
void Info(string message);
void Warn(string message);
…..
}
好的,在您的代碼中,您將注入記錄器的單例引用,例如:
x.For<ILogger>().Singleton().Use<MyLogger>();
現在,我通常更喜歡約定優於配置,但對於記錄器,通過配置文件進行配置是一個很大的優勢,因為當您的代碼處於生產狀態時,您有時會希望通過禁用或啟用記錄器來更改記錄規則,更改日志級別,並啟用/禁用命名記錄器。
我發現實現這一目標的最簡單,最可重用的方法是在評論時將配置放在外部文件中,然后我就不用在代碼中調用XmlConfigurator
了,因為我只需添加幾個應用程序設置就可以了。我的配置文件是這樣的
<!-- Relative to the application root path -->
<add key="log4net.Config" value="Logger.log4net"/>
<add key="log4net.Config.Watch" value="True"/>
而已。 這些應用程序設置會覆蓋您的log4net配置,並且易於維護。 您的配置文件如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<!-- This section contains the log4net configuration settings -->
<log4net>
<!-- Define some output appenders -->
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<file value="webapp-log.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<!-- Setup the root category, add the appenders and set the default priority -->
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
</root>
</log4net>
要配置更多appender: 單擊此處
在您的項目中,您只需要對logger抽象組件的引用,並且只需在Web項目(或Windows應用程序中,它是相同的)添加log4net配置文件,只需添加那些應用程序設置
由於您正在創建可重用的組件,我建議您在組織中設置一個內部Nuget服務器(它只是一個IIS應用程序)並使用它來部署組件,在這種情況下是包含記錄器的庫。 如果你創建一個只包含應用程序設置和log4net配置文件的不同Nuget包,那也更好,所以你只能在你的web項目中安裝這個Nuget包
也許對於您的Web應用程序,您可以嘗試在application_start中加載配置文件(gloabal.asax.cs)
void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("Logger.config")));
}
你可能想試試這個: http://forums.asp.net/t/1739162.aspx/1或這一個 。 默認情況下,Web應用程序將僅查看其主要webconfig並從區域/文件夾進行配置。 您應確保在新的appConfig
for log4net
包含以下所有必需的配置:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="logfile.txt"/>
<appendToFile value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="FileAppender"/>
</root>
</log4net>
ps也檢查這個答案: web.config可以從外部xml文件中讀取嗎? 如果web.config不包含配置文件,請確保也部署配置文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.