如何将ASP.NETCore项目中的NLog日志记录功能进行优化和扩展?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2142个文字,预计阅读时间需要9分钟。
目录
一、前言
二、使用NLog
1.引入NLog
2.添加配置文件
3.在控制器中使用
4.读取指定位置的配置文件
三、封装
1.前言
2.在所有应用程序中,日志功能是不可能的或缺失的模块,我们可以封装
目录
- 一、前言
- 二、使用NLog
- 1、引入NLog
- 2、添加配置文件
- 3、在控制器中使用
- 4、读取指定位置的配置文件
- 5、封装
一、前言
在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试、查看产生的错误信息,在ASP.NET Core中我们可以使用log4net或者NLog日志组件来实现记录日志的功能,这里讲解如何在ASP.NET Core中使用NLog。
这里采用的是.NET Core 3.1创建应用程序。
那么什么是NLog呢?
NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加即为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的调试诊断信息,根据个人的爱好配置其输出的样式,然后发送到一个或多个输出目标(target)中。
NLog的API非常类似于log4net,且配置方式非常简单。NLog使用路由表进行配置,这样就让NLog的配置文件非常容易阅读,并便于今后维护。
NLog遵循BSD license,即允许商业应用且完全开放源代码。任何人都可以免费使用并对其进行测试,然后通过邮件列表反馈问题以及建议。
NLog支持.NET、C/C++以及COM组件,因此我们的程序、组件、包括用C++/COM编写的遗留模块都可以通过同一个路由引擎将信息发送至NLog中。
简单来说,NLog就是用来记录项目日志的组件。
二、使用NLog
首先我们创建一个WebAPI的项目:
1、引入NLog
直接在NuGet里面搜索NLog.Web.AspNetCore,然后进行安装即可,如下图所示:
安装完成以后在依赖项里面就可以看到了:
修改Program类,在里面配置使用NLog,代码如下所示:
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using NLog.Web; namespace NLogDemo { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) // 配置使用NLog .UseNLog(); } }
2、添加配置文件
右键添加新建项,然后选择Web配置文件,命名为nlog.config如下图所示:
nlog.config文件结构如下:
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" autoReload="true" throwConfigExceptions="true" internalLogLevel="info" internalLogFile="E:\log\internal-nlog.txt"> <!--autoReload:修改后自动加载,可能会有延迟--> <!--throwConfigExceptions:NLog日志系统抛出异常--> <!--internalLogLevel:内部日志的级别--> <!--internalLogFile:内部日志保存路径,日志的内容大概就是NLog的版本信息,配置文件的地址等等--> <!--输出日志的配置,用于rules读取--> <targets> <!--write logs to file--> <!--将日志写入文件中,fileName可以指定日志生成的路径--> <target xsi:type="File" name="allfile" fileName="D:\Log\nlog-all-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /> <!--同样是将文件写入日志中,写入的内容有所差别,差别在layout属性中体现。写入日志的数量有差别,差别在路由逻辑中体现--> <target xsi:type="File" name="ownFile-web" fileName="D:\Log\nlog-my-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /> <target xsi:type="Null" name="blackhole" /> </targets> <rules> <!--路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。--> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Skip Microsoft logs and so log only own logs--> <!--以Microsoft打头的日志将进入此路由,由于此路由没有writeTo属性,所有会被忽略--> <!--且此路由设置了final,所以当此路由被匹配到时。不会再匹配此路由下面的路由。未匹配到此路由时才会继续匹配下一个路由--> <logger name="Microsoft.*" minlevel="Trace" final="true" /> <!--上方已经过滤了所有Microsoft.*的日志,所以此处的日志只会打印除Microsoft.*外的日志--> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog>
添加完配置文件以后,我们还需要修改配置文件的属性,设置为始终复制,如下图所示:
3、在控制器中使用
通过上面的步骤,我们已经完成NLog的配置,接下来我们就可以在控制器中使用了,通过构造函数注入的方式实现注入。控制器代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace NLogDemo.Controllers { [Route("api/[controller]")] [ApiController] public class NLogTestController : ControllerBase { private readonly ILogger<NLogTestController> _logger; public NLogTestController(ILogger<NLogTestController> logger) { _logger = logger; } [HttpGet] public IActionResult Get() { _logger.LogError("这是错误信息"); _logger.LogDebug("这是调试信息"); _logger.LogInformation("这是提示信息"); return Ok(); } } }
运行程序,访问nlogtest控制器,然后查看是否有日志生成:
我们在nlog.config里面配置的文件路径是D:\Log,从上面的截图中看到,有日志生成了 。这里生成了两个日志文件,这是因为我们在nlog.config里面配置的日志级别不同。日志内容如下:
可以看到,启动过程中的Microsoft日志也输出了,如果不想输出Microsoft日志,修改nlog.config里rules节点下面的路径规则顺序即可。
4、读取指定位置的配置文件
上面的例子中,我们是直接在项目的根目录下面添加的nlog.config文件,有时候我们想把程序里面的配置文件都放到单独的文件夹里面,这样方便管理,那么该如何设置让程序读取指定位置的nlog.config文件呢?看下面的例子。
新建一个文件夹,命名为XmlConfig,然后把nlog.config文件移到到XmlConfig文件夹下面,移到后的结构如下图所示:
然后修改Program文件,在程序里面设置读取XmlConfig文件夹下面的nlog.config文件,代码如下:
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using NLog.Web; namespace NLogDemo { public class Program { public static void Main(string[] args) { // 设置读取指定位置的nlog.config文件 NLogBuilder.ConfigureNLog("XmlConfig/nlog.config"); CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) // 配置使用NLog .UseNLog(); } }
这样就可以读取XmlConfig文件夹下面的配置文件了。
5、封装
上面的例子中,最后输出的日志格式是根据nlog.config配置文件里面的layout样式输出的,有时候输出的内容可能不满足我们的需求,我们可以对程序中的日志功能模块进行封装,输出我们自己定义的日志格式。
在解决方案中添加一个类库,命名为Nlog.Framework,然后在类库中添加一个Log文件夹,把所有Log相关的文件都放到该文件夹下,添加后的项目结构如下图所示:
添加LogMessage类,里面是要记录的一些信息属性字段:
using System; namespace Nlog.Framework.Log { /// <summary> /// 日志消息 /// </summary> public class LogMessage { /// <summary> /// IP /// </summary> public string IpAddress { get; set; } /// <summary> /// 操作人 /// </summary> public string OperationName { get; set; } /// <summary> /// 操作时间 /// </summary> public DateTime OperationTime { get; set; } /// <summary> /// 日志信息 /// </summary> public string LogInfo { get; set; } /// <summary> /// 跟踪信息 /// </summary> public string StackTrace { get; set; } } }
添加一个格式化类,用来格式化日志输出内容:
using System.Text; namespace Nlog.Framework.Log { /// <summary> /// 格式化输出样式 /// </summary> public class LogFormat { public static string ErrorFormat(LogMessage logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 操作时间: " + logMessage.OperationTime +" \r\n"); strInfo.Append("2. 操作人: " + logMessage.OperationName + " \r\n"); strInfo.Append("3. Ip : " + logMessage.IpAddress +"\r\n"); strInfo.Append("4. 错误内容: " + logMessage.LogInfo + "\r\n"); strInfo.Append("5. 跟踪: " + logMessage.StackTrace + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } } }
这里使用依赖注入的方式,所以我们首先定义一个接口,代码如下:
using System; namespace Nlog.Framework.Log { public interface INLogHelper { void LogError(Exception ex); } }
然后定义接口的实现类,代码如下:
using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System; namespace Nlog.Framework.Log { public class NLogHelper : INLogHelper { //public static Logger logger { get; private set; } private readonly IHttpContextAccessor _github.com/jxl1024/NLog
到此这篇关于ASP.NET Core使用NLog记录日志的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。
本文共计2142个文字,预计阅读时间需要9分钟。
目录
一、前言
二、使用NLog
1.引入NLog
2.添加配置文件
3.在控制器中使用
4.读取指定位置的配置文件
三、封装
1.前言
2.在所有应用程序中,日志功能是不可能的或缺失的模块,我们可以封装
目录
- 一、前言
- 二、使用NLog
- 1、引入NLog
- 2、添加配置文件
- 3、在控制器中使用
- 4、读取指定位置的配置文件
- 5、封装
一、前言
在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试、查看产生的错误信息,在ASP.NET Core中我们可以使用log4net或者NLog日志组件来实现记录日志的功能,这里讲解如何在ASP.NET Core中使用NLog。
这里采用的是.NET Core 3.1创建应用程序。
那么什么是NLog呢?
NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加即为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的调试诊断信息,根据个人的爱好配置其输出的样式,然后发送到一个或多个输出目标(target)中。
NLog的API非常类似于log4net,且配置方式非常简单。NLog使用路由表进行配置,这样就让NLog的配置文件非常容易阅读,并便于今后维护。
NLog遵循BSD license,即允许商业应用且完全开放源代码。任何人都可以免费使用并对其进行测试,然后通过邮件列表反馈问题以及建议。
NLog支持.NET、C/C++以及COM组件,因此我们的程序、组件、包括用C++/COM编写的遗留模块都可以通过同一个路由引擎将信息发送至NLog中。
简单来说,NLog就是用来记录项目日志的组件。
二、使用NLog
首先我们创建一个WebAPI的项目:
1、引入NLog
直接在NuGet里面搜索NLog.Web.AspNetCore,然后进行安装即可,如下图所示:
安装完成以后在依赖项里面就可以看到了:
修改Program类,在里面配置使用NLog,代码如下所示:
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using NLog.Web; namespace NLogDemo { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) // 配置使用NLog .UseNLog(); } }
2、添加配置文件
右键添加新建项,然后选择Web配置文件,命名为nlog.config如下图所示:
nlog.config文件结构如下:
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" autoReload="true" throwConfigExceptions="true" internalLogLevel="info" internalLogFile="E:\log\internal-nlog.txt"> <!--autoReload:修改后自动加载,可能会有延迟--> <!--throwConfigExceptions:NLog日志系统抛出异常--> <!--internalLogLevel:内部日志的级别--> <!--internalLogFile:内部日志保存路径,日志的内容大概就是NLog的版本信息,配置文件的地址等等--> <!--输出日志的配置,用于rules读取--> <targets> <!--write logs to file--> <!--将日志写入文件中,fileName可以指定日志生成的路径--> <target xsi:type="File" name="allfile" fileName="D:\Log\nlog-all-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /> <!--同样是将文件写入日志中,写入的内容有所差别,差别在layout属性中体现。写入日志的数量有差别,差别在路由逻辑中体现--> <target xsi:type="File" name="ownFile-web" fileName="D:\Log\nlog-my-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" /> <target xsi:type="Null" name="blackhole" /> </targets> <rules> <!--路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。--> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Skip Microsoft logs and so log only own logs--> <!--以Microsoft打头的日志将进入此路由,由于此路由没有writeTo属性,所有会被忽略--> <!--且此路由设置了final,所以当此路由被匹配到时。不会再匹配此路由下面的路由。未匹配到此路由时才会继续匹配下一个路由--> <logger name="Microsoft.*" minlevel="Trace" final="true" /> <!--上方已经过滤了所有Microsoft.*的日志,所以此处的日志只会打印除Microsoft.*外的日志--> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog>
添加完配置文件以后,我们还需要修改配置文件的属性,设置为始终复制,如下图所示:
3、在控制器中使用
通过上面的步骤,我们已经完成NLog的配置,接下来我们就可以在控制器中使用了,通过构造函数注入的方式实现注入。控制器代码如下:
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace NLogDemo.Controllers { [Route("api/[controller]")] [ApiController] public class NLogTestController : ControllerBase { private readonly ILogger<NLogTestController> _logger; public NLogTestController(ILogger<NLogTestController> logger) { _logger = logger; } [HttpGet] public IActionResult Get() { _logger.LogError("这是错误信息"); _logger.LogDebug("这是调试信息"); _logger.LogInformation("这是提示信息"); return Ok(); } } }
运行程序,访问nlogtest控制器,然后查看是否有日志生成:
我们在nlog.config里面配置的文件路径是D:\Log,从上面的截图中看到,有日志生成了 。这里生成了两个日志文件,这是因为我们在nlog.config里面配置的日志级别不同。日志内容如下:
可以看到,启动过程中的Microsoft日志也输出了,如果不想输出Microsoft日志,修改nlog.config里rules节点下面的路径规则顺序即可。
4、读取指定位置的配置文件
上面的例子中,我们是直接在项目的根目录下面添加的nlog.config文件,有时候我们想把程序里面的配置文件都放到单独的文件夹里面,这样方便管理,那么该如何设置让程序读取指定位置的nlog.config文件呢?看下面的例子。
新建一个文件夹,命名为XmlConfig,然后把nlog.config文件移到到XmlConfig文件夹下面,移到后的结构如下图所示:
然后修改Program文件,在程序里面设置读取XmlConfig文件夹下面的nlog.config文件,代码如下:
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using NLog.Web; namespace NLogDemo { public class Program { public static void Main(string[] args) { // 设置读取指定位置的nlog.config文件 NLogBuilder.ConfigureNLog("XmlConfig/nlog.config"); CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) // 配置使用NLog .UseNLog(); } }
这样就可以读取XmlConfig文件夹下面的配置文件了。
5、封装
上面的例子中,最后输出的日志格式是根据nlog.config配置文件里面的layout样式输出的,有时候输出的内容可能不满足我们的需求,我们可以对程序中的日志功能模块进行封装,输出我们自己定义的日志格式。
在解决方案中添加一个类库,命名为Nlog.Framework,然后在类库中添加一个Log文件夹,把所有Log相关的文件都放到该文件夹下,添加后的项目结构如下图所示:
添加LogMessage类,里面是要记录的一些信息属性字段:
using System; namespace Nlog.Framework.Log { /// <summary> /// 日志消息 /// </summary> public class LogMessage { /// <summary> /// IP /// </summary> public string IpAddress { get; set; } /// <summary> /// 操作人 /// </summary> public string OperationName { get; set; } /// <summary> /// 操作时间 /// </summary> public DateTime OperationTime { get; set; } /// <summary> /// 日志信息 /// </summary> public string LogInfo { get; set; } /// <summary> /// 跟踪信息 /// </summary> public string StackTrace { get; set; } } }
添加一个格式化类,用来格式化日志输出内容:
using System.Text; namespace Nlog.Framework.Log { /// <summary> /// 格式化输出样式 /// </summary> public class LogFormat { public static string ErrorFormat(LogMessage logMessage) { StringBuilder strInfo = new StringBuilder(); strInfo.Append("1. 操作时间: " + logMessage.OperationTime +" \r\n"); strInfo.Append("2. 操作人: " + logMessage.OperationName + " \r\n"); strInfo.Append("3. Ip : " + logMessage.IpAddress +"\r\n"); strInfo.Append("4. 错误内容: " + logMessage.LogInfo + "\r\n"); strInfo.Append("5. 跟踪: " + logMessage.StackTrace + "\r\n"); strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n"); return strInfo.ToString(); } } }
这里使用依赖注入的方式,所以我们首先定义一个接口,代码如下:
using System; namespace Nlog.Framework.Log { public interface INLogHelper { void LogError(Exception ex); } }
然后定义接口的实现类,代码如下:
using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using System; namespace Nlog.Framework.Log { public class NLogHelper : INLogHelper { //public static Logger logger { get; private set; } private readonly IHttpContextAccessor _github.com/jxl1024/NLog
到此这篇关于ASP.NET Core使用NLog记录日志的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。

