5

我的目标是创建一个可以跨多个项目共享的 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 文件中的 and 元素。配置部分应如下所示:

我将配置从 logger.config 移动到 web.config,一切似乎都运行良好。

我不希望 web.config 中的 log4net 配置,但将它作为更清洁的方法使用 logger.config。目标是让其他项目使用这个库,而不必担心每个项目的配置。

现在的问题是,我该怎么做?我究竟做错了什么?任何带有代码示例的建议都会对每个人都有益。

仅供参考,我正在使用结构映射 IOC 来重新爱上记录器,然后再登录它。

4

3 回答 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>();

现在,我通常更喜欢约定而不是配置,但是在记录器的情况下,通过配置文件进行配置是一个很大的优势,因为当您的代码在生产中时,您有时会希望通过禁用或启用记录器来更改日志记录规则,更改日志级别,并启用/禁用命名记录器。

我发现完成此操作的最简单和最可重用的方法是按照您的评论将配置放在外部文件中,然后我不会费心调用XmlConfiguratorin 代码,因为它对我来说更简单,只需将几个应用程序设置添加到我的像这样的配置文件

<!-- 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 应用程序)并使用它来部署您的组件,在这种情况下是包含记录器的库。此外,如果您创建一个仅包含应用程序设置和 log4net 配置文件的不同 Nuget 包会更好,因此您只能在您的 Web 项目中安装此 Nuget 包

于 2012-06-10T00:42:09.160 回答
3

也许对于您的 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")));
    }
于 2012-06-09T10:27:59.083 回答
2

您可能想试试这个: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 也检查一下这个答案:Can a web.config read from an external xml file? 如果 web.config 不包含它,请确保您也部署了配置文件。

于 2012-06-07T04:36:27.353 回答