zoukankan      html  css  js  c++  java
  • .NET Core 使用NLog日志记录

     

    前言

    每个项目都会需要使用到日志功能,这对于项目上线后 出现的bug异常,能及时定位和便于后期错误分析。那我们今天来看看在.NET Core中如何使用NLog日志。

    NLog

    什么是NLog呢?

    NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。
    NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。
    NLog的API非常类似于log4net,且配置方式非常简单。NLog使用路由表(routing table)进行配置,这样就让NLog的配置文件非常容易阅读,并便于今后维护。
    NLog遵从BSD license,即允许商业应用且完全开放源代码。任何人都可以免费使用并对其进行测试,然后通过邮件列表反馈问题以及建议。
    NLog支持.NET、C/C++以及COM interop API,因此我们的程序、组件、包括用C++/COM 编写的遗留模块都可以通过同一个路由引擎将信息发送至NLog中。
    简单来说Nlog就是用来记录项目日志的组件

    使用步骤

    已入Nlog包

    ①在NuGet中安装:Nlog 和  Nlog.Web.AspNetCore

    ②配置Configure如下

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
         loggerFactory.AddNLog();//添加NLog
                //引入Nlog配置文件
        env.ConfigureNLog("nlog.config");
    }

    ③添加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"
           internalLogLevel="Warn"
           internalLogFile="internal-nlog.txt">
         <!--define various log targets-->
         <targets>
            <!--write logs to file-->
             <target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log"
                      layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
        
             <target xsi:type="File" name="ownFile-web" fileName="nlog-my-${shortdate}.log"
                      layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
            <target xsi:type="Null" name="blackhole" />
      </targets>
         <rules>
             <!--All logs, including from Microsoft-->
             <logger name="*" minlevel="Trace" writeTo="allfile" />
        
           <!--Skip Microsoft logs and so log only own logs-->
             <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
             <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
      </rules>
    </nlog>

    ⑤在HomeController中添加DI注入

     private readonly ILogger<HomeController> _logger;
     public HomeController(ILogger<HomeController> logger)
        {
                _logger = logger;
        }

    ⑥测试效果

    _logger.LogError("我是错误显示");
    _logger.LogDebug("我是调试信息");
     _logger.LogInformation("我是提示信息");

    执行后,查看bin/debug/netcoreapp2.0下面的nlog-my-2018-08-12.log文件即可看到输出日志:

    日志文件生成在指定目录下

    大家会发现文件是生成在项目目录下的,日志多的时候,会导致文件目录太乱

    此时,只需更改nlog.config中的内容如下即可生成在logs目录里

    <targets>
            <!--write logs to file-->
             <target xsi:type="File" name="allfile" fileName="logs/all/nlog-all-${shortdate}.log"
                      layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
        
             <target xsi:type="File" name="ownFile-web" fileName="logs/my/nlog-my-${shortdate}.log"
                      layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
            <target xsi:type="Null" name="blackhole" />
      </targets>

    关于Nlog日志的就先介绍到这儿,这只是一个基础入门讲解,更多内容可以参考:Nlog官网

    异常处理

    对于全局异常处理,通常有几种方式,我们这里介绍一个常见的做法:

    ①我们在web下新建一个文件夹ErrorHand

    ②在此文件夹中新建一个ErrorHandlingMiddleware类如下

    public class ErrorHandlingMiddleware
        {
            private readonly RequestDelegate _next;
            private readonly ILogger<ErrorHandlingMiddleware> _logger;
    
            public ErrorHandlingMiddleware(RequestDelegate next,ILogger<ErrorHandlingMiddleware> logger)
            {
                this._next = next;
                _logger = logger;
            }
    
            public async Task Invoke(HttpContext context)
            {
                try
                {
                    await _next(context);
                }
                catch (Exception e)
                {
                    var statusCode = context.Response.StatusCode;
                    if (e is ArgumentException)
                    {
                        statusCode = 200;
                    }
    
                   await  HandleExceptionAsync(context, statusCode, e.Message);
                }
                finally
                {
                    var statusCode = context.Response.StatusCode;
                    var msg = "";
                    if (statusCode != 200)
                    {
                        _logger.LogError(context.Request.GetAbsoluteUri()+"
    "+statusCode.ToString());
                    }
    
                    if (!string.IsNullOrEmpty(msg))
                    {
                       await  HandleExceptionAsync(context, statusCode, msg);
                    }
                }
            }
    
            private static Task HandleExceptionAsync(HttpContext context, int statusCode, string msg)
            {
                var data = new {code = statusCode.ToString(), is_success = false, msg = msg};
                var result = JsonConvert.SerializeObject(new {data = data});
                context.Response.ContentType = "application/json;charset=utf-8";
                return context.Response.WriteAsync(result);
            }
        }

    这里类内容比较简单,就不多赘述了,此时,我们全局异常类已经编写好了,但是,还无法正常使用,我们需要在Startup中配置一下

    ③我们需要在Configure方法中加入:

    //全局错误
    app.UseMiddleware(typeof(ErrorHandlingMiddleware));

    这个地方就是绑定了我们自定义的错误类。

    注:.netCore中 提供了两个我们可以跳转到错误页面,一个是404的,一个是500的,同样在Configure方法中加入:

    app.UseExceptionHandler("/Home/NothingFound");
    app.UseStatusCodePagesWithReExecute("/Home/NothingFound");

    这样当有对应异常出现的时候,就可以跳转到自己的错误页。然后配合NLog可以查看到相应输出日志。

  • 相关阅读:
    A1023 Have Fun with Numbers (20分)(大整数四则运算)
    A1096 Consecutive Factors (20分)(质数分解)
    A1078 Hashing (25分)(哈希表、平方探测法)
    A1015 Reversible Primes (20分)(素数判断,进制转换)
    A1081 Rational Sum (20分)
    A1088 Rational Arithmetic (20分)
    A1049 Counting Ones (30分)
    A1008 Elevator (20分)
    A1059 Prime Factors (25分)
    A1155 Heap Paths (30分)
  • 原文地址:https://www.cnblogs.com/zhangxiaoyong/p/9463791.html
Copyright © 2011-2022 走看看