• .net core中的那些常用的日志框架(NLog篇)


    前言

    咱们上回讲到,.net core中内置的Logging日志框架的使用,以及浅显的讲解,接下来,给大家介绍一个第三方日志框架(NLog)。

    NLog简介

    NLog是适用于各种.NET平台(包括.NET标准)的灵活,免费的日志记录平台。NLog使写入多个目标变得容易 。(数据库,文件,控制台)并即时更改日志记录配置。

    NLog的优势

    • NLog支持结构化 和传统日志记录。
    • NLog的重点是:高性能,易于使用,易于扩展和灵活配置。

    1.NuGet安装NLog

    NLog.Web.AspNetCore
    NLog.Config
    

    简短说明:

    • NLog.Web.AspNetCore:引入第三方的服务,可以在程序中使用
    • NLog.Config:安装之后,会自动生成一个配置文件模板(NLog.Config)。

    2.引入服务(Program)

      public class Program
        {
            public static void Main(string[] args)
            {
                //添加Nlog的配置项
                NLogBuilder.ConfigureNLog("NLog.config");
                CreateHostBuilder(args).Build().Run();
            }
    
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                     .ConfigureLogging(log => {
                    //从builder移除内置的日志框架(如果引用第三方,一定要设置这属性)
                    log.ClearProviders();
                    //将日志添加到控制台
                    log.AddConsole();
                    //将日志添加到Debug窗口
                    log.AddDebug();
                    })
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    }).
                    UseNLog();//引用第三方日志框架
        }
    

    需要注意的几个地方:

    • NLogBuilder.ConfigureNLog("NLog.config");引入配置文件
    • log.ClearProviders();移除内置的日志框架(Logging)
    • log.AddConsole();将日志添加到控制台
    • log.AddDebug();将日志添加到debug窗口
    • UseNLog()在末尾引入第三方的日志框架(一定要写

    3.修改NLog.Config文件

    简单介绍配置文件中的配置信息

    + xmlns,xsi是引入命名空间
    + autoReload="true"是热更新,在程序运行过程中也可以修改配置文件
    + throwExceptions:NLog日志系统抛出异常
    + internalLogLevel:日志级别
    + internalLogFile:内部日志文件
    + variable:定义变量
    + targets:日志输出地方
    + rules:日志的路由规则
    

    3.1日志显示控制台版本

    <?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"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="false"
          internalLogLevel="Off" internalLogFile="c:	emp
    log-internal.log">
      <variable name="myvar" value="myvalue"/>
    
      <targets>
          <!--使用可自定义的着色将日志消息写入控制台-->
          <target name="colorConsole" xsi:type="ColoredConsole" layout="[${date:format=HH:mm:ss}]:${message} ${exception:format=message}" />
      </targets>
    
      <rules>
        <logger name="*" minlevel="Warn" writeTo="colorConsole" />
      </rules>
    </nlog>
    

    效果如下:

    3.2日志存入本地txt版本

    需要注意的地方

    target中的参数

    • name:是指的输出地方的一个名词(给rules调用的)
    • xsi:type:输出文件的类型,File指的是文件
    • fileName:输出到目标文件的地址,使用的相对路径,可以自行配置输出的地点。
    • layout:在最简单的形式中,布局是带有嵌入标记的文本,这些嵌入标记由${和分隔}
    • archiveFileName:表示滚动日志存放路径
    • archiveAboveSize:单次日志的存储大小(单位是KB),超过配置,会archiveFileName中创建新的日志
    • archiveNumbering:Sequence(排序),Rolling(滚动)
    • concurrentWrites:支持多个并发一起写文件,提高文件写入性能。
    • keepFileOpen:为了提高文件写入性能,避免每次写入文件都开关文件
    • autoFlush:为了提高日志写入性能,不必每次写入日志都直接写入到硬盘
    • createDirs:若设置的日志文件夹不存在,则自动创建文件夹。

    rules中的参数

    • logger:代表一个路由的规则
    • name:logger名称,若为*则表示适用于所有日志
    • minlevel:表示当前日志的最低日志级别,只有等于或大于该值的日志级别才会被记录
    • writeTo:和target的name匹配,一个rules对应一个target
    <?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"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="false"
          internalLogLevel="Off" internalLogFile="c:	emp
    log-internal.log">
    
      <!-- optional, add some variables
      https://github.com/nlog/NLog/wiki/Configuration-file#variables
      -->
      <variable name="myvar" value="myvalue"/>
    
      <targets>
    
          <!--项目日志保存文件路径说明fileName="${basedir}/保存目录,以年月日的格式创建/${shortdate}/${记录器名称}-${单级记录}-${shortdate}.txt"-->
          <target name="log_file" xsi:type="File"
                  fileName="${basedir}/Logs/${shortdate}/${logger}-${level}-${shortdate}.txt"
                  layout="${longdate} | ${message} ${onexception:${exception:format=message} ${newline} ${stacktrace} ${newline}"
                  archiveFileName="${basedir}/archives/${logger}-${level}-${shortdate}-{#####}.txt"
                  archiveAboveSize="1024"
                  archiveNumbering="Sequence"
                  concurrentWrites="true"
                  keepFileOpen="false"
                  autoFlush="false"
                  encoding="utf-8"
                  createDirs="true"
                 />
          <!--使用可自定义的着色将日志消息写入控制台-->
          <target name="colorConsole" xsi:type="ColoredConsole" layout="[${date:format=HH:mm:ss}]:${message} ${exception:format=message}" />
      </targets>
      <rules>
        <logger name="Microsoft.*" minlevel="Info" writeTo="log_file" final="true" />
        <logger name="*" minlevel="Info" writeTo="log_file" />
        <!--logger name="*" minlevel="Warn" writeTo="colorConsole" /-->
      </rules>
    </nlog>
    

    效果如下

    正如大家看到一样,是以日志的类型进行区分建立txt日志文档,这样不仅可以区分不同的日志级别,还可以根据不同的Controller生成对应的日志,在以后分析日志的问题的时候,可以精确到某一个点的日志问题。

    3.3日志存入数据库版本

    您可以将此目标与各种数据库提供程序一起使用,例如System.Data,Microsoft.Data,Oracle,MySql,SqlLite等,本文以SQL为例。
    注意事项

    • 在.net core中使用Nlog,dbProvider需要设置说明(是什么数据库,在Nlog的官方文档有明确提示)
    • 根据不同的数据库,安装不同的驱动,本文使用的是SQL Server,所以需要在NuGet安装:Microsoft.Data.SqlClient
    3.3.1需要创建数据库
    CREATE TABLE [dbo].[NLog] (
       [ID] [int] IDENTITY(1,1) NOT NULL,
       [MachineName] [nvarchar](200) NULL,
       [Logged] [datetime] NOT NULL,
       [Level] [varchar](5) NOT NULL,
       [Message] [nvarchar](max) NOT NULL,
       [Logger] [nvarchar](300) NULL,
       [Properties] [nvarchar](max) NULL,
       [Callsite] [nvarchar](300) NULL,
       [Exception] [nvarchar](max) NULL,
     CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([ID] ASC) 
       WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) 
    
    
    3.3.2配置Nlog
    <?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"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="false"
          internalLogLevel="Off" internalLogFile="c:	emp
    log-internal.log">
    
      <!-- optional, add some variables
      https://github.com/nlog/NLog/wiki/Configuration-file#variables
      -->
      <variable name="myvar" value="myvalue"/>
    
      <targets>
        <!--存储数据库-->
        <target name="apiUsageLog" 
                xsi:type="Database" 
                dbProvider="Microsoft.Data.SqlClient.SqlConnection,Microsoft.Data.SqlClient" 
                connectionString="Data Source=.;Initial Catalog=test;User ID=sa;Password=123456;">
          <commandText>
            INSERT INTO [dbo].[NLog] (
        [MachineName],
        [Logged],
        [Level],
        [Message],
        [Logger],
        [Properties],
        [Callsite],
        [Exception]
      ) VALUES (
        @machineName,
        @logged,
        @level,
        @message,
        @logger,
        @properties,
        @callsite,
        @exception
      );
          </commandText>
          <parameter name="@machineName"    layout="${machinename}" />
      <parameter name="@logged"         layout="${date}" />
      <parameter name="@level"          layout="${level}" />
      <parameter name="@message"        layout="${message}" />
      <parameter name="@logger"         layout="${logger}" />
      <parameter name="@properties"     layout="${all-event-properties:separator=|}" />
      <parameter name="@callsite"       layout="${callsite}" />
      <parameter name="@exception"      layout="${exception:tostring}" />
        </target>
      </targets>
    
      <rules>
        <logger name="*" minlevel="Trace" writeTo="apiUsageLog" />
      </rules>
    </nlog>
    
    3.3.3如何使用?
            //获取Nlog对象
            private Logger _logger = LogManager.GetCurrentClassLogger();
            public void Get()
            {
                _logger.Info("asd");
                _logger.Debug("测试消息Debug");
                _logger.Warn("测试消息Warn");
                _logger.Trace("测试消息Trace");
                _logger.Error("测试消息Error");
            } 
    
    3.3.4实际效果

    3.4邮箱发送日志版本

    这个比较简单,只需要简单配置即可

    <?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"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="false"
          internalLogLevel="Off" internalLogFile="c:	emp
    log-internal.log">
    
      <!-- optional, add some variables
      https://github.com/nlog/NLog/wiki/Configuration-file#variables
      -->
      <variable name="myvar" value="myvalue"/>
    
      <targets>
        <!--邮箱-->
        <target xsi:type="Mail"
                name="emial"
                header="=============================================="
                footer="=============================================="
                html="true" 
                addNewLines="true"
                encoding="UTF-8"
                subject="测试日志信息${machinename}"
                body="${newline}${message}${newline}"
                enableSsl="true"
                to="接受邮件的邮箱地址"
                from="发送邮件的邮箱地址"
                smtpPassword="发送邮件的邮箱密码"
                smtpAuthentication="Basic"
                smtpServer="smtp.163.com"
                smtpPort="25"
                smtpUserName="发送邮件的邮箱地址">
        </target>
      </targets>
    
      <rules>
        <logger name="*" minlevel="Trace" writeTo="emial" />
      </rules>
    </nlog>
    
    

    效果如下图:

    4.总结

    想比较Logging日志框架,NLog的好处就不必多说,多样的存储方式,简洁明了的配置信息,在项目中使用,来给我带来很好的分析问题的好帮手,日志类型还可以分块,日志大小还能切割,极大的满足了我们的日常需求。需要注意一点,发邮件可以群发,需要配置,存数据库可以用存储过程,可以查看官方文档。

    5.参考文档

    Nlog官方文档

  • 相关阅读:
    apt常用命令(安装,更新,删除)
    记录一次坑爹的VM连接主机的路程
    VM安装centos
    初窥DB2之insert语句
    关于虚拟机的linux不能使用shell连接时的处理方法
    linux命令之查看字符集
    趣图:学JavaScript
    PHP搭建大文件切割分块上传功能示例
    判断变量是否不为空,函数isset()、!empty()与!is_null()的比较
    Javascript 中 null、NaN和undefined的区别
  • 原文地址:https://www.cnblogs.com/2828sea/p/13728018.html
Copyright © 2020-2023  润新知