Asp.net mvc 使用Ninject在MVC.NET上运行Log4Net

Asp.net mvc 使用Ninject在MVC.NET上运行Log4Net,asp.net-mvc,log4net,ninject,Asp.net Mvc,Log4net,Ninject,我正试图用Ninject在MVC.net项目中设置Log4Net。 我已经到了可以看到Ninject调试输出的地步,但仍然没有看到任何日志输出 这都是在我的本地主机上运行的,所以安全性不应该有任何问题 我的设置如下: 在AssemblyInfo.cs中,我将其添加到log4net到Web.config点进行配置 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)] 在Web.con

我正试图用Ninject在MVC.net项目中设置Log4Net。 我已经到了可以看到Ninject调试输出的地步,但仍然没有看到任何日志输出

这都是在我的本地主机上运行的,所以安全性不应该有任何问题

我的设置如下:

在AssemblyInfo.cs中,我将其添加到log4net到Web.config点进行配置

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)]
在Web.config中,我添加了以下部分

    <configSections>
       <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
    </configSections>

...
    <appSettings>
       <add key="log4net.Internal.Debug" value="true"/>
    </appSettings>
...
  <log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="log-file.txt" />
      <appendToFile value="true" />
      <encoding value="utf-8" />
      <layout type="log4net.Layout.SimpleLayout" />
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="FileAppender" />
    </root>
  </log4net>
然后,我在登录页面上放置了一个显式的抛出新异常(“testException”),以强制执行一个我希望在日志文件中看到的错误

从调试跟踪中,我在启动时看到以下内容

log4net: log4net assembly [log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821]. Loaded from [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\portal\63a118bb\781d84b7\assembly\dl3\40d137a6\9fb44da2_c951cc01\log4net.dll]. (.NET Runtime [4.0.30319.235] on Microsoft Windows NT 6.1.7601 Service Pack 1)
log4net: DefaultRepositorySelector: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository for assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7]
log4net: DefaultRepositorySelector: Assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7] Loaded From [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\portal\63a118bb\781d84b7\assembly\dl3\edd36351\91af46a2_c951cc01\Ninject.Extensions.Logging.Log4Net.dll]
log4net: DefaultRepositorySelector: Assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7] does not have a RepositoryAttribute specified.
log4net: DefaultRepositorySelector: Assembly [Ninject.Extensions.Logging.Log4Net, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: DefaultRepositorySelector: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]

我觉得这可能是一个配置问题,但是如果有任何帮助,我将不胜感激。

注入
ILog
ILogger
实例不会隐式注册任何类型的异常处理程序。它只允许您访问记录器。您仍然需要告诉它记录什么以及何时记录

如果要测试配置,请从控制器的某个操作发出日志调用,或使用某个
OnAction
事件调用程序。这可能会满足您的需求:

public class MyController : Controller
{
    protected override void OnActionExecuted(ActionExecutedContext context)
    {
        if (Logger != null)
        {
            string message = string.Format("Action executed: {0}.{1}",
                context.ActionDescriptor.ControllerDescriptor.ControllerName,
                context.ActionDescriptor.ActionName);
            Logger.Log(typeof(MyController), log4Net.Core.Level.Trace,
                message, context.Exception);
        }
        base.OnActionExecuted(context);
    }

    [Inject]
    public ILogger Logger { get; set; }
}

它将记录每个控制器操作,包括异常。如果您只关心异常,请在记录之前检查
context.Exception
context.ExceptionHandled
属性,或者最好编写一个自定义ActionFilter来执行此操作。

您是如何指示Ninject实例化ILog的?仅仅因为你有了这个属性,你就希望记录你的异常?您应该捕获它们并使用logger.Error(“Some message”,ex)显式记录它们。考虑使用一个动作过滤器来记录未处理的异常。您使用njut.ExtExist.Login?
public class MyController : Controller
{
    protected override void OnActionExecuted(ActionExecutedContext context)
    {
        if (Logger != null)
        {
            string message = string.Format("Action executed: {0}.{1}",
                context.ActionDescriptor.ControllerDescriptor.ControllerName,
                context.ActionDescriptor.ActionName);
            Logger.Log(typeof(MyController), log4Net.Core.Level.Trace,
                message, context.Exception);
        }
        base.OnActionExecuted(context);
    }

    [Inject]
    public ILogger Logger { get; set; }
}