学习如何使用网络核心构建Web应用程序。记录事件和错误的最佳方法是什么?
答案 0 :(得分:1)
您可以使用NLog,ASP.NET Core提供了一些日志记录提供程序,例如Console,Debug,但是它们无法记录到文件。通过使用NLog,您可以将应用程序日志保存到文件甚至数据库中。步骤是:
首先,安装NLog NuGet软件包:
Install-Package NLog.Web.AspNetCore
然后在NLog使用的项目中创建一个名为nlog.config
的配置文件,如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true">
<variable name="logDir" value="${basedir}/logs" />
<targets>
<target name="logFile"
xsi:type="File"
fileName="${logDir}/log_${shortdate}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"/>
<target name="logConsole" xsi:type="Console" />
</targets>
<rules>
<logger name="Microsoft.*" minlevel="Trace" writeTo="logConsole" final="true" />
<logger name="*" minlevel="Trace" writeTo="logFile" />
</rules>
</nlog>
有关上述配置文件的更多详细信息,您可以阅读以下内容:NLog Configuration file
在Configure
类的Startup
方法中,添加以下代码以添加NLog日志记录提供程序及其服务
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
…
loggerFactory.AddNLog();
env.ConfigureNLog("nlog.config");
app.UseHttpsRedirection();
app.UseMvc();
}
最后,您可以在控制器中使用NLog:
public ValueController(ILogger<ValueController> logger)
{
Logger = logger;
}
public ILogger<AuthorController> Logger { get; }
关于记录异常,您可以创建一个实现IExceptionFilter
的类,该类是ASP.NET Core中的MVC筛选器,可以在应用程序运行时捕获异常,还可以在筛选器中注入NLog记录器。
public class GlobalExceptionFilter:IExceptionFilter
{
public GlobalExceptionFilter(IHostingEnvironment env, ILogger<Startup> logger)
{
Environment = env;
Logger = logger;
}
public IHostingEnvironment Environment { get; }
public ILogger Logger { get; }
public void OnException(ExceptionContext context)
{
if (Environment.IsDevelopment())
{
// log exception and show its details
}
else
{
// log exception and show generic error info
}
}
}
之后,您可以在Startup
类中应用该过滤器:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(config =>
{
config.Filters.Add<GlobalExceptionFilter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}