使用log4net创建日志库的最佳实践。

5
我的目标是创建一个可以在多个项目间共享的log4net库。
我的解决方案是在.net 4.0中创建了一个名为Logger的类库,并从Web项目中引用它。
现在我在类库中创建了一个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,一切似乎都工作正常。

我不希望将 log4net 配置放在 web.config 中,而是将其作为更干净的方法放在 logger.config 中。目标是使其他项目使用此库而无需担心每个项目中的配置。

现在的问题是,我该怎么做?我错在哪里?任何附带代码示例的建议都将对每个人有所裨益。

顺便说一下,我正在使用结构映射 IOC 在记录器之前解决它。


1
我建议不要创建一个日志记录库 - 直接使用log4net即可。如果确实需要,可以在ILog上创建一些扩展方法。 - default.kramer
你尝试过将logger.config文件放入你的“bin”文件夹中吗? - mithun_daa
我怀疑你没有在构建时将配置文件配置为“始终复制”或“仅在较新时复制”。那些类型的文件往往被设置为“不复制”。 - pms1969
你的logger.config文件位于哪里?在Logger类库中还是在使用它的项目中?另外,你是如何从IOC解析logger的? - Maciej
3个回答

9

我相信你正在尝试重新发明轮子,有几种工具可以将记录器从您的代码中抽象出来,将记录器框架与您的代码解耦:

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>

要配置更多的附加程序:点击这里

在您的项目中,您只需要引用日志记录器抽象组件,并且只需在Web项目(或Windows应用程序,它们是相同的)中添加log4net配置文件和那些应用程序设置

由于您正在创建可重用组件,因此我建议您在组织中设置一个内部Nuget服务器(它只是一个IIS应用程序),并将其用于部署您的组件,例如包含日志记录器的库。此外,最好创建一个不同的Nuget包,仅包含应用程序设置和log4net配置文件,以便您只能在Web项目中安装此Nuget包。


Log4net是问题所在。我将上传带有注释和输出文本的文档。由于您最接近我想要做的事情,我将给予您赏金。 - VolleyBall Player

3
也许对于你的网络应用程序,可以尝试在应用程序启动时(global.asax.cs)加载配置文件。
    void Application_Start(object sender, EventArgs e)
    {
        log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(Server.MapPath("Logger.config")));
    }

2
您可以尝试这个链接:http://forums.asp.net/t/1739162.aspx/1 或者这个链接:one。 默认情况下,Web应用程序仅查找其主要Web配置文件以及区域/文件夹中的配置文件。 您应该确保在新的appConfig中包含所有所需的配置,例如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>

附注:也请查看这个答案:Can a web.config read from an external xml file? 如果web.config没有包含它,请确保部署配置文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接