zoukankan      html  css  js  c++  java
  • .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官方文档

  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/2828sea/p/13728018.html
Copyright © 2011-2022 走看看