编写controller记录前台日志_ASP.NET Core:ASP.NET Core中使用NLog记录日志

一、前言

在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试、查看产生的错误信息,在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的项目:

239a6bdbb4b0d9deb3c717e8e8aa2131.png

1、引入NLog

直接在NuGet里面搜索NLog.Web.AspNetCore,然后进行安装即可,如下图所示:

51d61be581645302518980d42214b09d.png

安装完成以后在依赖项里面就可以看到了:

83edbf8e692eae79185256f28de208b0.png

修改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();                })                // 配置使用NLog                .UseNLog();    }}

2、添加配置文件

右键添加新建项,然后选择Web配置文件,命名为nlog.config如下图所示:

8bd6a5452ee2e8191b95bd2cd3780eb4.png

nlog.config文件结构如下:

<?xml version="1.0" encoding="utf-8" ?> 

添加完配置文件以后,我们还需要修改配置文件的属性,设置为始终复制,如下图所示:

a0ff5105abf3d1bd321df39c896f3ab4.png

3、在控制器中使用

通过上面的步骤,我们已经完成NLog的配置,接下来我们就可以在控制器中使用了,通过构造函数注入的方式实现注入。控制器代码如下:

using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Logging;namespace NLogDemo.Controllers{    [Route("api/[controller]")]    [ApiController]    public class NLogTestController : ControllerBase    {        private readonly ILogger _logger;        public NLogTestController(ILogger logger)        {            _logger = logger;        }        [HttpGet]        public IActionResult Get()        {            _logger.LogError("这是错误信息");            _logger.LogDebug("这是调试信息");            _logger.LogInformation("这是提示信息");            return Ok();        }    }}

运行程序,访问nlogtest控制器,然后查看是否有日志生成:

3e51ff26036270ded0d26ec1fb473243.png

我们在nlog.config里面配置的文件路径是D:Log,从上面的截图中看到,有日志生成了 。这里生成了两个日志文件,这是因为我们在nlog.config里面配置的日志级别不同。日志内容如下:

c5465636405bcce1ae7aadf8d137e88a.png

可以看到,启动过程中的Microsoft日志也输出了,如果不想输出Microsoft日志,修改nlog.config里rules节点下面的路径规则顺序即可。

4、读取指定位置的配置文件

上面的例子中,我们是直接在项目的根目录下面添加的nlog.config文件,有时候我们想把程序里面的配置文件都放到单独的文件夹里面,这样方便管理,那么该如何设置让程序读取指定位置的nlog.config文件呢?看下面的例子。

新建一个文件夹,命名为XmlConfig,然后把nlog.config文件移到到XmlConfig文件夹下面,移到后的结构如下图所示:

7a054f569a7f888b28c2d261ca90e962.png

然后修改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();                })                // 配置使用NLog                .UseNLog();    }}

这样就可以读取XmlConfig文件夹下面的配置文件了。

5、封装

上面的例子中,最后输出的日志格式是根据nlog.config配置文件里面的layout样式输出的,有时候输出的内容可能不满足我们的需求,我们可以对程序中的日志功能模块进行封装,输出我们自己定义的日志格式。

在解决方案中添加一个类库,命名为Nlog.Framework,然后在类库中添加一个Log文件夹,把所有Log相关的文件都放到该文件夹下,添加后的项目结构如下图所示:

6ecf7f10ca8cd3337ac4cbf3635f6f7d.png

添加LogMessage类,里面是要记录的一些信息属性字段:

using System;namespace Nlog.Framework.Log{    ///     /// 日志消息    ///     public class LogMessage    {        ///         /// IP        ///         public string IpAddress { get; set; }        ///         /// 操作人        ///         public string OperationName { get; set; }        ///         /// 操作时间        ///         public DateTime OperationTime { get; set; }        ///         /// 日志信息        ///         public string LogInfo { get; set; }        ///         /// 跟踪信息        ///         public string StackTrace { get; set; }    }}

添加一个格式化类,用来格式化日志输出内容:

using System.Text;namespace Nlog.Framework.Log{    ///     /// 格式化输出样式    ///     public class LogFormat    {        public static string ErrorFormat(LogMessage logMessage)        {            StringBuilder strInfo = new StringBuilder();            strInfo.Append("1. 操作时间: " + logMessage.OperationTime +" ");            strInfo.Append("2. 操作人: " + logMessage.OperationName + " ");            strInfo.Append("3. Ip  : " + logMessage.IpAddress +"");            strInfo.Append("4. 错误内容: " + logMessage.LogInfo + "");            strInfo.Append("5. 跟踪: " + logMessage.StackTrace + "");            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------");            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 _httpContextAccessor;        private readonly ILogger _logger;        public NLogHelper(IHttpContextAccessor httpContextAccessor, ILogger logger)        {            _httpContextAccessor = httpContextAccessor;            _logger = logger;        }        public void LogError(Exception ex)        {            LogMessage logMessage = new LogMessage();            logMessage.IpAddress = _httpContextAccessor.HttpContext.Request.Host.Host;            if (ex.InnerException != null)                logMessage.LogInfo = ex.InnerException.Message;            else                logMessage.LogInfo = ex.Message;            logMessage.StackTrace = ex.StackTrace;            logMessage.OperationTime = DateTime.Now;            logMessage.OperationName = "admin";            _logger.LogError(LogFormat.ErrorFormat(logMessage));        }    }}

为了演示效果,我们添加一个全局异常过滤器,代码如下:

using Microsoft.AspNetCore.Mvc.Filters;using Nlog.Framework.Log;using System.Threading.Tasks;namespace NLogDemo.Filter{    ///     /// 异步版本自定义全局异常过滤器    ///     public class CustomerGlobalExceptionFilterAsync : IAsyncExceptionFilter    {        private readonly INLogHelper _logHelper;        public CustomerGlobalExceptionFilterAsync(INLogHelper logHelper)        {            _logHelper = logHelper;        }        ///         /// 重新OnExceptionAsync方法        ///         /// 异常信息        ///         public Task OnExceptionAsync(ExceptionContext context)        {            // 如果异常没有被处理,则进行处理            if (context.ExceptionHandled == false)            {                // 记录错误信息                _logHelper.LogError(context.Exception);                // 设置为true,表示异常已经被处理了,其它捕获异常的地方就不会再处理了                context.ExceptionHandled = true;            }            return Task.CompletedTask;        }    }}

接着添加一个控制器,在控制器里面模拟发生错误的操作,代码如下:

using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Logging;namespace NLogDemo.Controllers{    [Route("api/[controller]")]    [ApiController]    public class ValuesController : ControllerBase    {        ///         /// 日志        ///         private readonly ILogger _logger;        public ValuesController(ILogger logger)        {            _logger = logger;        }        [HttpGet]        public IActionResult Test()        {            _logger.LogError("测试封装日志");            int i = 0;            int result = 10 / i;            return Ok();        }    }}

修改Program类:

using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Hosting;using NLog;using NLog.Web;using System;namespace NLogDemo{    public class Program    {        public static void Main(string[] args)        {            // 读取指定位置的配置文件            var logger = NLogBuilder.ConfigureNLog("XmlConfig/nlog.config").GetCurrentClassLogger();            try            {                logger.Info("Init Main");                CreateHostBuilder(args).Build().Run();            }            catch (Exception ex)            {                logger.Error(ex, "Stopped program because of exception");            }            finally            {                LogManager.Shutdown();            }        }        public static IHostBuilder CreateHostBuilder(string[] args) =>            Host.CreateDefaultBuilder(args)                .ConfigureWebHostDefaults(webBuilder =>                {                    webBuilder.UseStartup();                })                // 配置使用NLog                .UseNLog();    }}

最后在Startup类里面注入:

public void ConfigureServices(IServiceCollection services){    #region 添加异常处理过滤器    services.AddControllers(options => options.Filters.Add(typeof(CustomerGlobalExceptionFilterAsync)));    #endregion    services.AddSingleton();    services.AddSingleton();    // NLogHelper.LoadLogger();    services.AddControllers();}

这样就完成了一个简单的封装,运行程序,访问value控制器测试:

04571afa110a7b20d01548d6d82cfe89.png

上面的例子中,只是封装了Error,如果是其他级别的日志,可以自己封装。

GitHub地址:git@github.com:jxl1024/NLog.git

转自 https://www.cnblogs.com/dotnet261010/p/13286218.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值