使用 OWIN 时使用 log4net 记录未处理的错误
Using log4net to log unhandled errors when using OWIN
你能告诉我一些 log4net 教程或示例,这些教程或示例记录了使用 OWIN 时在我的 MVC Web Api 上发生的所有未处理的异常吗?
我有一个 Startup
class 配置 Castle Windsor
和 OAuth
,我不确定如何处理启用 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
添加到记录器。
你能告诉我一些 log4net 教程或示例,这些教程或示例记录了使用 OWIN 时在我的 MVC Web Api 上发生的所有未处理的异常吗?
我有一个 Startup
class 配置 Castle Windsor
和 OAuth
,我不确定如何处理启用 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
添加到记录器。