簡體   English   中英

使用log4net創建記錄器庫的最佳實踐。 是

[英]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://slf.codeplex.com/

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM