C# WebAPI中的日志异常

C# WebAPI中的日志异常,c#,asp.net-web-api,exception-handling,log4net,castle-windsor,C#,Asp.net Web Api,Exception Handling,Log4net,Castle Windsor,我有一个基于ASP.NETWebAPI的项目&我正在使用Log4Net记录异常。下面是异常处理的内容 [RoutePrefix("api/customer")] public class CustomerController : ApiController { private ILogger _logger = NullLogger.Instance; public HttpResponseMessage Get(int id) { try

我有一个基于ASP.NETWebAPI的项目&我正在使用Log4Net记录异常。下面是异常处理的内容

[RoutePrefix("api/customer")]
public class CustomerController : ApiController
{
    private ILogger _logger = NullLogger.Instance;

    public HttpResponseMessage Get(int id)
    {
       try
       {
          // my stuff
       }
       catch(Exception ex)
       {
            LogException(ex);
       }
    }
}

private void LogException(Exception ex)
{
    var msgParams = new Dictionary<string, string>
    {
        { "Message", ex.Message },
        { "StackTrace", ex.StackTrace },
    };
    _logger.Info(JsonConvert.SerializeObject(msgParams));
}
[RoutePrefix(“api/客户”)]
公共类CustomerController:ApiController
{
private ILogger _logger=NullLogger.Instance;
公共HttpResponseMessage获取(int id)
{
尝试
{
//我的东西
}
捕获(例外情况除外)
{
LogException(ex);
}
}
}
私有无效日志例外(例外情况除外)
{
var msgParams=新字典
{
{“消息”,例如消息},
{“StackTrace”,例如StackTrace},
};
_Info(JsonConvert.SerializeObject(msgParams));
}
DI配置

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.Log4net).WithConfig("log4net.xml"));
}
public void安装(IWindsorContainer,IConfigurationStore)
{
container.AddFacility(f=>f.LogUsing(LoggerImplementation.Log4net).WithConfig(“Log4net.xml”);
}
我的Web.Config

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Http.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Cors" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Http.Cors" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
  </dependentAssembly>

  <dependentAssembly>
    <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.3.0.0" newVersion="3.3.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Castle.Windsor" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.3.0.0" newVersion="3.3.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Common.Logging.Core" publicKeyToken="af08829b84f0328e" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.3.1.0" newVersion="3.3.1.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.3.1.0" newVersion="3.3.1.0" />
  </dependentAssembly>
</assemblyBinding>

Log4Net.xml

<?xml version="1.0" encoding="utf-8" ?>


但当任何异常发生时&控件进入catch块,既不会创建任何日志文件,也不会记录异常。

我在这里错过了什么


非常感谢您的帮助/建议。

您的记录器是私有的,您不需要通过构造函数注入这种依赖关系。Castle要通过属性注入来注入它,它应该是公共的

你可以在地图上看到更多。 温莎城堡的建议:


您的记录器是私有的,您不通过构造函数注入此依赖项。Castle要通过属性注入来注入它,它应该是公共的

你可以在地图上看到更多。 温莎城堡的建议:


您还没有显示您的castle初始化和注册不同的对象-比所有的程序集绑定更相关我将在这里详细介绍一下,虽然我对Log4Net一无所知,并且说,
NullLogger
类看起来非常可疑…添加到xml中的Log4Net节点
debug=true
,这可能会给你一些线索。你还没有展示你的castle初始化和注册不同的对象-比所有的程序集绑定更相关我将在这里讨论一个问题,虽然我对Log4Net一无所知,并且说
NullLogger
类看起来非常可疑…添加到xml中的log4net节点
debug=true
,这可能会给你一些线索。如果这是原因,那么我应该得到Null exception,但在我的情况下,我既没有得到任何异常,也没有记录任何异常exception@Kgn-web-不,您不会,因为
NullLogger
不是空的。这是一个什么都不做的记录器。Castle提供了一个很好的方法,让您可以直接调用logger,而不用担心它是否已被设置(因为logger通常是一个副业,是一个类的弱依赖项)@Kgn web-如果您调试代码,您将看到记录器被调用,如果您检查,您将看到它不是空的,而是一个正确的对象-您可以检查实现,但它可能只是有空的函数实现请再次检查。然而,我在帖子中添加了我的DI内容。请看一看,如果这是原因,那么我应该得到Null exception,但在我的情况下,我既没有得到任何异常,也没有记录任何异常exception@Kgn-web-不,您不会,因为
NullLogger
不是空的。这是一个什么都不做的记录器。Castle提供了一个很好的方法,让您可以直接调用logger,而不用担心它是否已被设置(因为logger通常是一个副业,是一个类的弱依赖项)@Kgn web-如果您调试代码,您将看到记录器被调用,如果您检查,您将看到它不是空的,而是一个正确的对象-您可以检查实现,但它可能只是有空的函数实现请再次检查。然而,我在帖子中添加了我的DI内容。请看一看
<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">

    <file value="App.log" />

    <appendToFile value="true" />

    <maximumFileSize value="100KB" />
    <maxSizeRollBackups value="2" />

    <encoding value="utf-8" />

    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %level %thread %logger - %message%newline" />
    </layout>

</appender>

<root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
</root>
private ILogger logger = NullLogger.Instance;

public CustomerService()
{
}

public ILogger Logger
{
   get { return logger; }
   set { logger = value; }
}