.net 使用log4net创建记录器库的最佳实践。是
我的目标是创建一个可以跨多个项目共享的log4net库 在我的.NET4.0解决方案中,我创建了一个名为Logger的类库,并从web项目中引用了它 现在,我在类库中创建了一个logger.config,并将所有配置放在logger.config文件中。然后我用.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.
[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>