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】的配置文件,如下所示:
| 序号 | 配置文件 |
| 1 | 标准程序配置文件【一般为XXX程序名称.exe.config)】 |
| 2 | 程序目录下的NLog.Config文件 |
| 3 | NLog.dll所在目录下的NLog.dll.nlog文件(仅当未在全局程序集缓存中部署NLog时) |
| 序号 | 配置文件 |
| 1 | 标准网络程序配置文件web.config |
| 2 | 程序目录下的NLog.config文件 |
| 3 | NLog.dll所在目录下的NLog.dll.nlog文件(仅当未在全局程序集缓存中部署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根节点属性功能说明 |
| 1 | autoReload="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属性说明 |
| 1 | name | 表示target的名字 【即:路由规则根据该target名字将日志信息内容输出到该目标集】 |
| 2 | type | 表示target类型 【即使用xsi命名空间时的类型,可支持多种方式的】 |
target的所有属性语法内容和说明如下:
//是否要在创建的文件中编写BOM(字节顺序标记)默认是false
《1》同步单日志文件的NLog.config配置内容
指定日志文件的相对路径语法为:【${basedir}等价于(AppDomain.BaseDirectory)】;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】元素定义的;且路由规则控制了哪些记录器对象、日志级别处于活动状态和输出的目标内容;
| 序号 | 路由规则属性 | 说明 |
| 1 | name | 【必填】匹配记录器的名称(可使用通配符【*(匹配0个或多个)、?(匹配一个)】匹配) ②也可以通过使用指定一个显示名称来指定记录器【NLog.LogManager.GetLogger("testClassName")】 |
| 2 | minlevel | 【必填】最小的日志级别 |
| 3 | maxlevel | 最大的日志级别 |
| 4 | level | 单一级别日志 |
| 5 | levels | 使用逗号分隔的日志级别列表 |
| 6 | writeTo | 【必填】可使用逗号分隔要写入的目标列表 |
| 7 | final | 最终的规则匹配处理,之后的将不处理 |
| 8 | enabled | 设置标记为禁用规则而无需删除或注释规则 |
| 9 | ruleName | 规则名称(允许使用【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》日志级别
| 序号 | 日志级别名称 | 说明 |
| 1 | Trace | 【用在开发测试环境中】(记录追踪最详细的内容) |
| 2 | Debug | 【用在开发测试环境中】(记录需要查看的内部事件调试应用程序信息) |
| 3 | Info | 【用于生产环境中】(记录高频信息或应用程序生命周期事件的信息) |
| 4 | Warn | 【用于生产环境中】(记录有关验证问题或面临失败的警告信息) |
| 5 | Error | 【用于生产环境中】(记录有关功能失败或意外错误的信息) |
| 6 | Fatal | 【用于生产环境中】(记录导致应用程序意外退出、无法执行的信息) |
《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} | 异常信息 |



