使用OWIN时使用log4net记录未处理的错误

时间:2015-02-20 09:22:35

标签: log4net asp.net-web-api2 owin

你能指点我一些log4net教程或样本,记录使用OWIN时我的MVC Web Api上发生的所有未处理异常吗?

我有一个Startup类,用于配置Castle WindsorOAuth,我不确定如何为启用OWIN的应用程序处理应用程序错误。

我已尝试将log4net代码放在Application_Error中的global.asax事件中,但它永远不会被执行。

public class WebApiApplication : System.Web.HttpApplication {
    protected void Application_Start() {
        log4net.Config.XmlConfigurator.Configure();
    }        
    protected void Application_Error(object sender,EventArgs e) {
        Exception lastException = Server.GetLastError();
        var logger = log4net.LogManager.GetLogger(typeof(WebApiApplication));
        logger.Fatal(lastException);
    }
}

为什么会这样?

使用log4net配置

编辑:web.config

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

<log4net debug="true">
    <logger name="SiteWorksAPI">
      <level value="Debug" />
      <appender-ref ref="EventLogAppender" />
    </logger>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
      <file value="C:\ProgramData\Site\SiteWorksAPILog.txt" />
      <appendToFile value="true" />
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
      <immediateFlush value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="============================================================%nLogger = %logger.%nLocation = %location.%nUnique Token = %property{x-fcc-uniquetoken}.%nDate = %date{dd MMM yyyy - HH:mm:ss}.%nMessage = %message%n" />
      </layout>
    </appender>
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
      <applicationName value="SiteWorks.API" />
      <logname value="SiteWorks API Log" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="Date: %date{dd MMM yyyy - HH:mm:ss} %nMessage: %message %nIdentity: %identity %nUnique Token: %property{x-fcc-uniquetoken} %nChange Time Stamp: %property{x-fcc-changedatetime} %nOriginal Time Stamp: %property{x-fcc-originaltimestamp} %nOriginating System: %property{x-fcc-originatingsystem} %nOriginating User: %property{x-fcc-originatingusername} %nRequest Uri: %property{Request} %nResponse Headers: %property{ResponseHeaders}%nLogger: %logger  %nThread: %thread  %n%n%exception" />
      </layout>
    </appender>
</log4net>

1 个答案:

答案 0 :(得分:1)

您没有看到任何日志事件,因为您尚未在配置中定义root记录器 - 您定义的唯一记录器名为SiteWorksAPI,因此您使用任何其他记录器创建的记录器名称 - 例如,以typeof(WebApiApplication)命名的名称 - 不会记录任何内容。如果在日志记录语句中添加断点,则会看到所有日志级别都被禁用。

根记录器中定义的appender由所有已命名的appender继承(除非使用additivity = false定义子appender) - 但是子appender设置了自己的日志级别。

<root>
  <level value="Debug" />
  <appender-ref ref="EventLogAppender" />
</root>

编辑:还有另外需要考虑的事情 - 您定义的记录器仅使用EventLogAppender - 请注意,为了记录事件日志,文档指出EventLogAppender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges需要创建事件源升级过程

出于测试目的,您可能希望将FileAppender添加到记录器中。