Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用log4net创建记录器库的最佳实践。是_.net_Asp.net Mvc 3_Logging_Log4net - Fatal编程技术网

.net 使用log4net创建记录器库的最佳实践。是

.net 使用log4net创建记录器库的最佳实践。是,.net,asp.net-mvc-3,logging,log4net,.net,Asp.net Mvc 3,Logging,Log4net,我的目标是创建一个可以跨多个项目共享的log4net库 在我的.NET4.0解决方案中,我创建了一个名为Logger的类库,并从web项目中引用了它 现在,我在类库中创建了一个logger.config,并将所有配置放在logger.config文件中。然后我用 [assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "Logger.config")] 当我运行web应用程序时,不会记录任何内容。所以我在web.

我的目标是创建一个可以跨多个项目共享的log4net库

在我的.NET4.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作为一种更干净的方法。目标是让其他项目使用这个库,而不必担心每个项目中的配置

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


仅供参考,我正在使用structure map IOC在登录到记录器之前重新启动记录器

您可能想试试这个:或者这个。 默认情况下,web应用程序将只查看其主网络配置,并从区域/文件夹进行配置(如果有)。 您应该确保在
log4net
的新
appConfig
中包含以下所有必需的配置:

  <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>


如果web.config不包含配置文件,请确保您也部署了配置文件。

对于您的web应用程序,您可以尝试在应用程序启动(gloabal.asax.cs)中加载配置文件


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

这些是.Net应用程序中最常见的

好吧,现在如果你坚持使用你自己的抽象(这是有效的),这是我的建议:

首先,我假设你会有这样的想法:

interface ILogger
{
    void Debug(string message);
    void Info(string message);
    void Warn(string message);
    …..
}
好的,在您的代码中,您将插入记录器的单例引用,如:

x.For<ILogger>().Singleton().Use<MyLogger>();
就这样。这些应用程序设置覆盖您的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>

在您的项目中,您只需要对logger抽象组件的引用,并且仅在web项目(或windows应用程序,相同)中添加log4net配置文件和那些应用程序设置


由于您正在创建一个可重用组件,我建议您在组织中设置一个内部Nuget服务器(它只是一个IIS应用程序),并使用它来部署您的组件,在本例中是包含记录器的库。另外,如果您创建一个仅包含应用程序设置和log4net配置文件的不同Nuget软件包会更好,因此您只能在web项目中安装此Nuget软件包

我建议不要创建日志库-直接使用log4net即可。如果确实需要,可以在
ILog
上创建一些扩展方法。是否尝试将logger.config文件放到“bin”文件夹中?我怀疑您没有在生成时将配置文件配置为“始终复制”或“更新时复制”。这些类型的文件往往被设置为“不复制”。logger.config文件位于哪里?在记录器类库中还是在使用它的项目中?另外,您如何从IOC解析记录器?Log4net是问题所在。我将上传带有评论和输出文本的文档。我会给你赏金,因为你是最接近我要做的事情的人。
<!-- Relative to the application root path -->
<add key="log4net.Config" value="Logger.log4net"/>
<add key="log4net.Config.Watch" value="True"/>
<?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>