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

Using log4net to log unhandled errors when using OWIN

你能告诉我一些 log4net 教程或示例,这些教程或示例记录了使用 OWIN 时在我的 MVC Web Api 上发生的所有未处理的异常吗?

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

我曾尝试将 log4net 代码放入 global.asax 中的 Application_Error 事件中,但它从未执行过。

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);
    }
}

知道这是为什么吗?

编辑:web.config 使用 log4net 配置:

<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>

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

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

<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 添加到记录器。