我的目标是创建一个可以跨多个项目共享的log4net库。
在我的.net 4.0中的解决方案中,我创建了一个名为Logger的类库,并从Web项目中引用它。
现在我在类库中创建了一个logger.config,并将所有配置放在logger.config文件中。然后我用
[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "Logger.config")]
当我运行网络应用程序时,没有任何记录。所以我在web.config
中添加了这行代码<add key="log4net.Internal.Debug" value="true"/>
给了我调试信息和错误信息
无法在应用程序的.config文件中找到配置部分“log4net”。检查.config文件中的和元素。配置部分应如下所示:
我将配置从logger.config移到了web.config,一切似乎都运行正常。
我不想在web.config中使用log4net配置,而是将logger.config作为一种更干净的方法。目标是使其他项目使用此库,而不必担心每个项目中的配置。
现在的问题是,我该怎么做?我究竟做错了什么?任何带代码示例的建议都将对每个人都有益。
仅供参考,我正在使用结构图IOC在登录之前重新获得记录器。
答案 0 :(得分:9)
我相信您正在尝试重新发明轮子,有几种工具可以从您的代码中抽取记录器,从而将记录器框架与代码分离:
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>
配置更多appender:click here
在您的项目中,您只需要对logger抽象组件的引用,并且只需在Web项目(或Windows应用程序中,它是相同的)添加log4net配置文件和那些应用程序设置
由于您正在创建可重用的组件,我建议您在组织中设置一个内部Nuget服务器(它只是一个IIS应用程序)并使用它来部署组件,在这种情况下是包含记录器的库。如果您创建一个仅包含应用程序设置和log4net配置文件的不同Nuget包,那么也会更好,因此您只能在Web项目中安装此Nuget包
答案 1 :(得分: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")));
}
答案 2 :(得分:2)
您可以尝试这样做:http://forums.asp.net/t/1739162.aspx/1或此one。
默认情况下,Web应用程序将仅查看其主要webconfig并从区域/文件夹进行配置。
您应该确保在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>
中包含以下所有必需的配置:
{{1}}
P.S。检查这个答案:Can a web.config read from an external xml file? 如果web.config不包含配置文件,请确保也部署配置文件。