Dot-Net

log4net 初始化

  • August 11, 2009

我一直在努力尋找重複項,但無論看起來多麼基本,都必須問以下問題,以便一勞永逸地弄清楚!

在 64 位 W7 上的 VS28KSP1 上使用 log4net 版本 1.2.10.0 的全新控制台應用程序中,我有以下程式碼:-

using log4net;
using log4net.Config;

namespace ConsoleApplication1
{
   class Program
   {
       static readonly ILog _log = LogManager.GetLogger(typeof(Program));
       static void Main(string[] args)
       {
           _log.Info("Ran");
       }
   }
}

在我的app.config,我有:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <configSections>
   <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
 </configSections>
 <log4net>
   <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
     <file value="Program.log" />
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
     <appendToFile value="true" />
     <rollingStyle value="Size" />
     <maxSizeRollBackups value="10" />
     <maximumFileSize value="1MB" />
     <staticLogFileName value="true" />
     <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="[%username] %date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
     </layout>
   </appender>

   <root>
     <level value="DEBUG" />
     <appender-ref ref="RollingFileAppender" />
   </root>
 </log4net>

</configuration>

這不會寫任何東西,除非我添加一個屬性:

[ assembly:XmlConfigurator ]

或者在 Main() 中顯式初始化它:

_log.Info("This will not go to the log");
XmlConfigurator.Configure();
_log.Info("Ran");

這提出了以下問題:

  1. 我幾乎可以肯定我已經看到它在某些版本的 log4net 上工作,而無需添加程序集屬性或呼叫 Main。有人可以向我保證我不會想像嗎?
  2. 有人可以指出我在文件中的哪個位置明確指出配置部分和初始化掛鉤都是必需的 - 希望解釋一下何時更改,如果確實如此?

我可以很容易地想像為什麼這可能是政策 - 明確初始化步驟以避免意外等,只是我似乎記得情況並非總是如此……(通常我將配置放在單獨的文件中,這通常會將配置部分排除在外)

根據手冊中的配置頁面

log4net 配置可以使用程序集級屬性進行配置,而不是通過程式方式指定。

XmlConfiguratorAttribute:log4net.Config.XmlConfiguratorAttribute允許XmlConfigurator使用以下屬性進行配置:

  • 配置文件…
  • 配置文件擴展…

如果 ConfigFile 或 ConfigFileExtension 屬性均未指定,則應用程序配置文件(例如 TestApp.exe.config)將用作 log4net 配置文件。

範例用法:

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.config in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.
                       

我同意這有點模棱兩可,但我將範例用法的存在解釋為 log4net 不會使用沒有上述屬性的 .config 文件;並且他們指出您必須使用這兩個屬性之一,但不要說完全省略該屬性的事實,這向我表明該屬性(或程式呼叫)是使用 app.config 所必需的你想要的方式。

引用自:https://stackoverflow.com/questions/1261158