栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

.NET平台下的日志记录工具类库NLog

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.NET平台下的日志记录工具类库NLog

一、NLog介绍 1.1、简介

   NLog是一个在.NET平台下的免费且具有丰富路由和管理功能的日志记录工具类库;适用于.NET平台下的所有编程语言,能够让开发人员通过配置文件自由的搭配日志样式内容,且调用方式很简单;让开发人员能够十分便捷高效的生成记录应用程序的日志;

    NLog还遵从BSD license【即允许商业应用且完全开放源代码;任何人都可以免费使用并对其进行测试】

1.2、效果演示

我这里的效果演示的是通过配置文件生成对应的日志级别文件、可以动态修改日志配置系统自动监测执行效果:

1.3、通过代码方式配置NLog

 如果想要通过代码方式配置NLog内容则可以参考如下链接:

Configure from code · NLog/NLog Wiki · GitHubhttps://github.com/NLog/NLog/wiki/Configure-from-code

二、NLog在项目中的配置使用 2.1、安装NLog包

 2.2、创建NLog的配置文件NLog.config

2.2.1、NLog配置文件的标准格式



    
        
        
    

    
        
        
    
2.2.2、我自己使用的NLog.config配置文件

首先需要在项目的根目录下创建NLog.config文件,文件内容如下:




	
	
	
		
		
			
			
		

		
		
			
		
		
		
	

	
	
		
		
		
		
		
		
		
		

	

      注意:该NLog.config配置文件创建完成后,需要选中该配置文件的属性,修改复制到输出目录为【始终复制】 ,如下图所示:

2.3、 写入日志示例 2.3.1、官方示例
public static class Program
{
    //获取NLog.config配置文件内容并实例化日志对象Logger
    private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

    public static void Main()
    {
        try
        {
           //写入Info级别的日志
           Logger.Info("Hello world");
           System.Console.ReadKey();
        }
        catch (Exception ex)
        {
           Logger.Error(ex, "Goodbye cruel world");
        }
    }
}  
 2.3.2、我自己使用的NLogHelper帮助类

   该帮助类可以避免在每个需要使用日志的类下实例化一次日志【 private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();】后才能调用;

    注意:如果使用了该帮助类,则在NLog的配置文件Rules里面的命名空间过滤那里只能使用*,而不能够使用指定的命名空间或(命名空间.类名称)进行精准过滤日志内容了。


using NLog;
using NLog.Config;
using NLog.Targets;
using System;
using System.Collections.Generic;

namespace NLogHelper
{
    public class LogHelper
    {
        #region   基础参数
        //获取配置文件并实例化
        private static Logger _logger;

        #endregion

        #region   单例模式
        private LogHelper()
        {
            _logger = LogManager.GetCurrentClassLogger();
        }

        private static class SingleHolder
        {
            internal static readonly LogHelper _Instance = new LogHelper();
        }

        public static LogHelper Instance
        {
            get { return SingleHolder._Instance; }
        }

        #endregion


        #region   信息的级别

        #region Trace——①追踪(最常见的记录信息【一般用于开发环境】的普通输出)
        public void Trace(string msg)
        {
            _logger.Trace(msg);
        }

        public void Trace(string msg, Exception err)
        {
            _logger.Trace(err, msg);
        }
        #endregion

        #region Debug——②调试(记录信息,出现频率比Trace少一些【一般用于开发环境】的调试程序)
        public void Debug(string msg)
        {
            _logger.Debug(msg);
        }

        public void Debug(string msg, Exception err)
        {
            _logger.Debug(err, msg);
        }
        #endregion

        #region Info——③信息(【用于生产环境】的消息记录)
        public void Info(string msg)
        {
            _logger.Info(msg);
        }

        public void Info(string msg, Exception err)
        {
            _logger.Info(err, msg);
        }
        #endregion

        #region Warn——④警告(【用于生产环境】的比较重要场合)
        public void Warn(string msg)
        {
            _logger.Warn(msg);
        }

        public void Warn(string msg, Exception err)
        {
            _logger.Warn(err, msg);
        }
        #endregion

        #region Error——⑤错误(【用于生产环境】的错误信息记录)
        public void Error(string msg)
        {
            _logger.Error(msg);
        }

        public void Error(string msg, Exception err)
        {
            _logger.Error(err, msg);
        }
        #endregion

        #region Fatal——⑥致命错误信息(【用于生产环境】的系统发生异常后无法执行记录)
        public void Fatal(string msg)
        {
            _logger.Fatal(msg);
        }

        public void Fatal(string msg, Exception err)
        {
            _logger.Fatal(err, msg);
        }
        #endregion

        #endregion

        /// 
        /// 刷新数据到日志文件中
        /// 
        /// 
        public void Flush(int? millisecondsTimeout = null)
        {
            if (millisecondsTimeout != null)
            {
                LogManager.Flush(millisecondsTimeout.Value);
            }

            LogManager.Flush();
        }

    }//Class_end
}
2.3.3、NLogHelper类的使用

 ①引入命名空间【using NLogHelper;】

 ②使用方法如下:

LogHelper.Instance.Trace("Trace log message");
LogHelper.Instance.Debug("Debug log message");
LogHelper.Instance.Info("Info log message");
LogHelper.Instance.Warn("Warn log message");
LogHelper.Instance.Error("Error log message");
LogHelper.Instance.Fatal("Fatal log message");

③日志效果如下:

 

 

 NLog日志的安装配置手册向导链接:

Tutorial · NLog/NLog Wiki · GitHubhttps://github.com/nlog/nlog/wiki/Tutorial

三、NLog的配置说明

如下是NLog项目的源码工程链接:

GitHub - NLog/NLog: NLog - Advanced and Structured Logging for Various .NET Platformshttps://github.com/NLog/NLog

3.1、NLog的配置文件NLog.config

    当.NET应用程序启动时,NLog程序会在项目根目录下检索配置信息,并加载首先发现的配置,同时停止搜索;如果找不到对应的配置文件信息则NLog启动失败;

为了NLog配置文件的通用性,可以直接使用【NLog.config】的配置文件,如下所示:

.NET单机应用程序检索NLog的配置文件情况
序号配置文件
1标准程序配置文件【一般为XXX程序名称.exe.config)】
2程序目录下的NLog.Config文件
3NLog.dll所在目录下的NLog.dll.nlog文件(仅当未在全局程序集缓存中部署NLog时)
Asp.Net网络应用程序检索NLog的配置文件情况
序号配置文件
1

标准网络程序配置文件web.config

2程序目录下的NLog.config文件
3NLog.dll所在目录下的NLog.dll.nlog文件(仅当未在全局程序集缓存中部署NLog时)
3.2、NLog配置文件说明

这是NLog的官方配置文件内容介绍地址https://github.com/NLog/NLog/wiki/Configuration-file#rules

3.3、剖析NLog的配置文件

    NLog配置文件时一个以【nlog为根节点】的xml文件,其中【targets(目标集)】、【rules(规则集)】是必须要填写的内容,适用于高级使用场景。




    
        
        
    

    
        
        
    
3.3.1、nlog根节点属性

 nlog根节点属性说明:

 nlog根节点属性说明
序号nlog根节点属性名称nlog根节点属性功能说明
1autoReload="true"添加autoReload="true"属性后,则表示在程序运行过程中NLog会监视NLog.config配置文件,只要该配置文件发生更改,则不用重启应用程序,可以直接识别改动执行对应内容。
2
internalLogLevel="Trace"
NLog输出日志时的Trace级别内部信息(可以修改为不同的级别),配置该项方便查看配置文件内容是否有误,开发时对排查配置文件错误很有帮助【但是:建议发布程序时关闭该项,以免影响效率】
3
internalLogFile="
C:NLogCoffeeProjectlog.txt">
NLog输出自己的信息文件路径【需配合internalLogLevel="Trace"】属性一起使用,也是建议发布程序时关闭该项,以免影响效率

 3.3.2、targets目标集 

NLog官方target内容配置说明链接https://github.com/NLog/NLog/wiki/File-target    targets节点中定义了多个日志输出的目标,每个日志输出目标是一个target元素;【通常情况下,每个target元素,必须指定name和type属性】

target必备内容
序号target属性target属性说明
1name

表示target的名字

【即:路由规则根据该target名字将日志信息内容输出到该目标集】

2type

表示target类型

【即使用xsi命名空间时的类型,可支持多种方式的】

 target的所有属性语法内容和说明如下:


     //是否要在创建的文件中编写BOM(字节顺序标记)默认是false

《1》同步单日志文件的NLog.config配置内容

指定日志文件的相对路径语法为:【${basedir}等价于(AppDomain.BaseDirectory)】;NLog支持的相对路径有如下四种:

NLog支持的相对路径内容
序号NLog相对路径语法内容NLog相对路径语法内容的说明
1${basedir:processDir=true}程序运行的目录
2${specialfolder:folder=CommonApplicationData:cached=true}所有用户文件夹下的AppData目录
3${specialfolder:folder=ApplicationData:cached=true}当前用户下的漫游(Roaming)目录
4${specialfolder:folder=LocalApplicationData:cached=true}当前用户下的本地(Local)目录


 
    
        
    
 
    
        
    

《2》日志文件目录也可以使用定义变量指定的绝对路径




《3》批量异步写入日志内容

NLog官方的异步包装器说明【AsyncWrapper target】https://github.com/NLog/NLog/wiki/AsyncWrapper-target    将多个日志消息写入一个日志文件时;使用批次写入将提高性能,特别是在使用keepfileopen = false时;使用AsyncWrapper时,会自动启用批处理异步写入【注意:使用AsyncWrapper时,需要在关闭程序时调用( LogManager.Flush()方法将缓存消息写入日志文件中)】。

批量异步写入日志内容的配置基础语法如下:


      //内存已被填满,这意味着后台线程写入日志的处理是滞后的,无法跟上应用程序的记录(默认值是丢弃【Discard】)
    
  

 注意:如果使用批量异步包装器但规则使用的是指定了包含在【AsyncWrapper】异步包装器的目标名称,则此时将不会使用异步写入日志文件;如下图配置所示:

   
      
        
      
    
      
       
    
   
3.3.3、rules路由规则

    路由规则是用一个记录器【logger】元素定义的;且路由规则控制了哪些记录器对象、日志级别处于活动状态和输出的目标内容;

路由规则属性
序号路由规则属性说明
1name

【必填】匹配记录器的名称(可使用通配符【*(匹配0个或多个)、?(匹配一个)】匹配)
①当使用【NLog.LogManager.GetCurrentClassLogger()】时,记录器会创建一个名字为调用类名称【包含:命名空间.类】;

②也可以通过使用指定一个显示名称来指定记录器【NLog.LogManager.GetLogger("testClassName")】

2minlevel【必填】最小的日志级别
3maxlevel最大的日志级别
4level单一级别日志
5levels使用逗号分隔的日志级别列表
6writeTo【必填】可使用逗号分隔要写入的目标列表
7final最终的规则匹配处理,之后的将不处理
8enabled设置标记为禁用规则而无需删除或注释规则
9ruleName规则名称(允许使用【Configuration.FindRuleByName】进行查找该规则)

如下是单规则路由示例(启用匹配所有记录器【name=*】,且最小日志级别为Trace及其之后【TraceDebugInfoWarnErrorFatal】的消息输出到控制台上显示):


       


       

 《1》记录器的名称过滤器说明

    当在需要输出日志的类中使用【nlog.logmanager.getCurrentClassLogger()】时,记录器(Logger)名称将具有“ namespace.classname”的格式。这使得在名称空间中的所有类设置过滤非常方便;如下所示:

namespace Test_NLog.Test
{
    public class TestNlog
    {
        //使用该方法将记录该类对应的命名空间和名称用于路由规则的过滤【即:Test_NLog.Test.TestNlog】
        Logger logger = LogManager.GetCurrentClassLogger();

        public void Test()
        {
            string log = $"这是用于测试_TestNlog=>{this.GetType().Name} 方法输出到日志";

            logger.Trace($"Trace_{log}");
            logger.Debug($"Debug_{log}");
            logger.Info($"Info_{log}");
            logger.Warn($"Warn_{log}");
            logger.Error($"Error_{log}");
            logger.Fatal($"Fatal_{log}");
        }

    }//Class_end
}





《2》日志级别

日志级别信息
序号日志级别名称说明
1Trace【用在开发测试环境中】(记录追踪最详细的内容)
2Debug【用在开发测试环境中】(记录需要查看的内部事件调试应用程序信息)
3Info【用于生产环境中】(记录高频信息或应用程序生命周期事件的信息)
4Warn【用于生产环境中】(记录有关验证问题或面临失败的警告信息)
5Error【用于生产环境中】(记录有关功能失败或意外错误的信息)
6Fatal【用于生产环境中】(记录导致应用程序意外退出、无法执行的信息)

《3》布局内容

NLog官方的布局内容详细文档https://nlog-project.org/config/?tab=layout-renderers      

常用的布局内容
序号布局内容说明
1${activityid}将日志信息添加到系统日志【system.Diagnostics trace】中
2${appdomain}应用程序域
3${assembly-version}应用程序
4${basedir}应用程序域的基目录
5${date}当前的日期和时间
6${longdate}当前日期和时间格式为【2022-05-03 11:40:03.1666】
7${shortdate}当前日期和时间格式为【2022-05-03】
8${date:yyyyMMddHHmmssFFF} 当前日期和时间格式为【202205031140031666】
9${time}当前的时间【11:40:03.1666】
10${guid}GUID
11${logger}配置的记录器名称
12${machinename}设备名称
13${windows-identity}Windows线程标识的用户名称
14${level}消息级别
15${message}输出的消息内容
16${newline}消息换行
17${stacktrace}堆栈跟踪渲染器
18${performancecounter}性能计数器
19${specialfolder}文件夹路径
20${threadId}当前线程的标识符
21${threadname}当前线程的名称
22${exception}异常信息
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/909166.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号