前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Asp.NetCore Web开发之Nlog日志配置

Asp.NetCore Web开发之Nlog日志配置

作者头像
宿春磊Charles
发布2022-03-29 09:39:07
9310
发布2022-03-29 09:39:07
举报
文章被收录于专栏:DotNet 致知

接着讲基于ASP .net Core 的web开发,这节主要讲一下如何使用和配置Nlog进行日志记录。

日志在开发中的作用是很重要的,使用日志,程序出了错误可以及时捕获并记录下来,开发人员可以通过日志定位错误,进行修复。

ASP .net Core虽然也给我们提供了一个原生的日志系统,但是这个日志系统不够强大,不能满足我们的一些需求,我们可以使用第三方的日志库,比较优秀的就是Nlog,使用它,我们首先要安装这个包,打开Nuget包管理器(了解详细的安装程序包请点击.Net Core平台下,添加包的引用),搜索:NLog.Web.AspNetCore 将其下载安装。

安装完成后,需要添加一个Nlog的xml配置文档:右键解决方案名,添加新项,如下图:

名字最好和图片一样,创建完成以后,将下方的配置代码复制到配置文件中:

代码语言:javascript
复制
<?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">

  <targets>

    <target xsi:type="File"

            name="logfile"

            fileName="${basedir}/logs/${shortdate}.log"

            keepFileOpen="false"

            layout="${longdate}|${callsite:fileName=True}

                |${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="File"

            name="debugfile"

            fileName="${basedir}/logs/${shortdate}_debug.log"

            keepFileOpen="false"

            layout="${longdate}|${callsite:fileName=True}

                |${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="File"

            name="errfile"

            fileName="${basedir}/logs/${shortdate}_error.log"

            keepFileOpen="false"

            layout="${longdate}|${callsite:fileName=True}

            |${uppercase:${level}}|${message} ${exception}" />

  </targets>

  <rules>

    <logger name="*" level="Debug" writeTo="debugfile" />

    <logger name="*" level="Error" writeTo="errfile" />

    <logger name="*" minlevel="Trace" writeTo="logfile" />

  </rules>

</nlog>

这个配置文件主要是配置日志规则,和存放日志文件的路径,有兴趣的同学可以去Nlog官网看一下配置文件的所有规则。

注意,配置文件还有很重要的一步,右键配置文件点击属性:

将复制到输入目录设置为总是复制:

这样,当你运行或者打包程序的时候,这个日志配置文件也会被打包在内。

接下来,我们要在Program.cs文件中配置使用Nlog,这个方法是用Nlog替代ASP.NetCore 自带的日志系统,也可以在Startup.cs中配置Nlog日志服务,两个方法都可以,先讲一下前者:

在Main方法的生成主机方法之前加入:

代码语言:javascript
复制
//配置Nlog
NLogBuilder.ConfigureNLog("Nlog.config");

这一步是加载配置文件,然后在CreateHostBuilder中添加几行配置:

代码语言:javascript
复制
.ConfigureLogging(l =>
    {
        //移除其余的Logger
        l.ClearProviders();
        //设置最低日志等级
        l.SetMinimumLevel(LogLevel.Information);
        //每次记录日志,都显示到控制台
        l.AddConsole();
    }).UseNLog()//使用Nlog

最终配置如下图:

这样,我们就可以使用Nlog记录日志了:

运行一遍以后,会在运行目录下生成log文件夹,和两个日志文件(路径可以在配置文件中修改):

接下来讲一下第二种方法,注册Nlog日志服务,首先在appsetting.json中添加如下配置:

代码语言:javascript
复制
"NLog": {
    "autoReload": true,
    "throwConfigExceptions": true,
    "internalLogLevel": "info",
    "internalLogFile": "${basedir}/logs/internal-nlog.txt",
    "extensions": {
      "NLog.Extensions.Logging": {
        "assembly": "NLog.Extensions.Logging"
      }
    },
    "variables": {
      "var_logdir": "${basedir}"
    },
    "default-wrapper": {
      "type": "AsyncWrapper",
      "overflowAction": "Block"
    },
    "targets": {
      "all-file": {
        "type": "File",
        "fileName": "${var_logdir}/logs/nlog-all-${shortdate}.log",
        "layout": {
          "type": "JsonLayout",
          "Attributes": [
            {
              "name": "time",
              "layout": "${longdate}"
            },
            {
              "name": "level",
              "layout": "${level}"
            },
            {
              "name": "target",
              "layout": "${callsite:className=true:methodName=true:skipFrames=1}"
            },
            {
              "name": "message",
              "layout": "${message:raw=true}",
              "escapeUnicode": "false"
            },
            {
              "name": "properties",
              "encode": "false",
              "layout": {
                "type": "JsonLayout",
                "includeallproperties": "true"
              }
            }
          ]
        }
      },
      "own-console": {
        "type": "LimitingWrapper",
        "interval": "00:00:01",
        "messageLimit": 100,
        "target": {
          "type": "Console",
          "layout": "${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|${callsite}"
        }
      }
    },
    "rules": [
      {
        "logger": "*",
        "minLevel": "Trace",
        "writeTo": "all-file"
      },
      {
        "logger": "Microsoft.*",
        "maxLevel": "Info",
        "final": true
      },
      {
        "logger": "*",
        "minLevel": "Debug",
        "writeTo": "own-console",
        "filters": {
          "whenRepeated": {
            "layout": "${message}",
            "action": "Ignore"
          }
        }
      }
    ]
  }

这个跟Nlog.config作用是一样的,然后在ConfigServices中注册服务:

代码语言:javascript
复制
//读取配置文件
LogManager.Configuration= new NLogLoggingConfiguration(Configuration.GetSection("NLog"));
var currentClassLogger = NLog.Web.NLogBuilder.ConfigureNLog(LogManager.Configuration).GetCurrentClassLogger();
services.AddSingleton<Logger>(currentClassLogger);

然后在需要的地方正常添加依赖注入(NLog.Logger类):

这里要说明一点,通过这个方式配置的Nlog,是不会覆盖自带的日志系统的,如果要取消,可以在CreateHostBuilder中配置,怎么移除上方有讲。

记录日志的方式如下:

代码语言:javascript
复制
_nlogger.Properties.Clear();
_nlogger.Error("Read once Data");

因为每次记录日志都会将属性值连带记录,它的属性值又是共有的,不清除的话,会有上次记录的冗余数据,这个当然是不友好的,所以要先清除,如果要记录额外数据的话,就可以为属性值赋值,它是一个键值对集合。

本节到此结束...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet 致知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档