log4net仅在调用XmlConfigurator.Configure()时有效

时间:2013-05-27 04:22:25

标签: c# .net log4net

我理解this question has been asked several times,但不幸的是,我还没有去过能够使我的日志配置工作。我必须在某个地方犯一些非常小的错误。

我有一个.NET 4.5 MVC 4 / EF 5 Web应用程序,我正在尝试登录工作。该解决方案有两个项目,一个用于DAO和模型对象,另一个用于网站。 App.Config文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="RebuildingTogetherEntities" connectionString="stuff..."/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
  <log4net configSource="Log.config" />
</configuration>

同样的log4net部分也已复制到Web.Config文件中。

我在AssemblyInfo.cs文件中添加了以下内容:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]
对于两个Log.Config文件,

“复制到输出目录”设置为true。

我似乎可以将日志记录附加到输出文件的唯一方法是在第一个日志记录语句运行之前调用XmlConfigurator.Configure()。我想当我第一次获得记录器时,我可以写一个外观,但这感觉不对。

如何在不手动调用XmlConfigurator的情况下初始化记录器?

2 个答案:

答案 0 :(得分:27)

我遇到了完全相同的问题。正如您正确指出的那样,当您在XmlConfigurator中添加该行时,您无需明确调用AssemblyInfo.cs。当第一次使用log4net处于没有该行的集合时,就会出现问题。在我的情况下,我使用的是Topshelf.Log4Net NuGet包,我的应用程序记录的第一个日志行是通过它。

您可以在应用程序的早期记录一行,或者如果您不需要记录任何操作,请在应用程序的入口点添加以下内容

LogManager.GetLogger(typeof(Program));

答案 1 :(得分:9)

如果使用:

,则无需手动调用XmlConfigurator
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]

但是你必须将标签添加到你的所有dll (所有assambly.cs文件)。