记录.net核心应用程序的最佳做法

时间:2019-01-16 17:00:05

标签: asp.net-mvc .net-core

学习如何使用网络核心构建Web应用程序。记录事件和错误的最佳方法是什么?

1 个答案:

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