在旧的ASP.NET,在Global.asax.cs
类中,当应用程序启动、停止并抛出未处理的异常时,我会记录:
-
Application_Start()
个 -
Application_End()
个 Application_Error()
如何在ASP中实现同样的功能.净核心?它有一个Startup
类,但它是用于配置的.
我应该在哪里挂接应用程序的启动/停止/错误事件?
在旧的ASP.NET,在Global.asax.cs
类中,当应用程序启动、停止并抛出未处理的异常时,我会记录:
Application_Start()
个Application_End()
个Application_Error()
如何在ASP中实现同样的功能.净核心?它有一个Startup
类,但它是用于配置的.
我应该在哪里挂接应用程序的启动/停止/错误事件?
注:适用于.NET Core 3.0或更高版本,此答案已过时.请看this answer.
你需要用Microsoft.AspNetCore.Hosting.IApplicationLifetime
/// <summary>
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
/// </summary>
CancellationToken ApplicationStarted { get; }
/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// Requests may still be in flight. Shutdown will block until this event completes.
/// </summary>
CancellationToken ApplicationStopping { get; }
/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// All requests should be complete at this point. Shutdown will block
/// until this event completes.
/// </summary>
CancellationToken ApplicationStopped { get; }
在Configure
个方法中可以获得IApplicationLifetime的实例.另请在此处添加ILoggerFactory:
public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime, ILoggerFactory loggerFactory)
{
// use applicationLifetime
}
有ILoggerFactory
个,你就可以create个ILogger
的实例:
var logger = loggerFactory.CreateLogger("StartupLogger");
因此,您只需要在Startup类中创建一个属性来持久化ILogger
的实例(或者ILoggerFactory
,如果您想要为不同的事件创建不同的Ligger实例).总结一下:
public class Startup
{
private ILogger _logger;
public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime, ILoggerFactory loggerFactory)
{
applicationLifetime.ApplicationStopping.Register(OnShutdown);
...
// add logger providers
// loggerFactory.AddConsole()
...
_logger = loggerFactory.CreateLogger("StartupLogger");
}
private void OnShutdown()
{
// use _logger here;
}
}