首页 > 解决方案 > Log4Net 未使用 UnityContainer 登录 .NET WebApi 项目

问题描述

我有一个非常基本的 C# .NET WebApi 项目,使用 Unity.AspNet.WebApi 和 Unity.Mvc 进行依赖注入,使用 Unity.log4net 进行日志记录。

注入我的控制器似乎工作正常。问题是记录器从不记录任何东西。永远不会创建预期的 .log 文件。当我在调试时检查记录器对象时,它禁用了所有级别(IsDebugEnable = false、IsErrorEnabled = false 等)

它正在运行,就好像忽略了我的 log4net.config 文件一样。在我的项目的根目录中,我有一个 log4net.config 文件,它定义了一个控制台和一个文件附加程序。

<log4net>
  <root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>
  <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date %level %logger - %message%newline" />
    </layout>
  </appender>
  <appender name="file" type="log4net.Appender.RollingFileAppender">
    <file value="DemoWebApiUnityLog4Net.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>

我已将此行添加到 AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true)]

log4net 使用以下行注册到 UnityConfig.cs 中的 Unity 容器中:

container.AddNewExtension<Log4NetExtension>();

完整的演示项目可以在这里找到:https ://github.com/CarmonColvin/DemoWebApiUnityLog4Net

我尝试过的任何事情都没有导致成功的日志。任何帮助表示赞赏。

标签: asp.net-mvcasp.net-web-apiunity-containerlog4net

解决方案


根据 log4net常见问题解答

如果您通过在程序集上指定程序集级别属性来配置 log4net,那么一旦第一次调用 LogManager.GetLogger,就会加载配置。在进程(或 AppDomain)期间对 LogManager.GetLogger 的第一次调用必须从具有配置属性的程序集进行。Log4net 只会在配置属性的第一个调用程序集上查找一次。

因此,在我看来,您应该在应用程序启动时调用以加载您的配置LogManager.GetLogger()Global.asax就像是:

using log4net;

protected void Application_Start(object sender, EventArgs e)
{
    var logger = LogManager.GetLogger(typeof(Global));
    logger.Info("Application started.");
}

推荐阅读