NLog之封装

 

前言

在上节“NLog之快速入门”简单认识了Nlog,这节讲述将Nlog封装成程序集使用。

环境

  • l Win10
  • l VS2022
  • l .NET5.0

项目实践

在上节“NLog之快速入门”项目基础上改造。项目如下:

wps306

新建项目

新建NLog封装项目:“Yak.Nlog.Framework”

Step1:添加依赖,添加后有:

<ItemGroup>

    <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />

    <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.1" />

  </ItemGroup>

Step2:添加日志消息类

/// <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; }

    }

Step3:添加封装Nlog接口

public interface INLogHelper

    {

void LogError(Exception ex);

    }

Step4:实现封装的Nlog接口。

public class NLogHelper : INLogHelper

    {

private readonly IHttpContextAccessor _httpContextAccessor;

private readonly ILogger<NLogHelper> _logger;

public NLogHelper(IHttpContextAccessor httpContextAccessor, ILogger<NLogHelper> 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 = "yak";

            _logger.LogError(LogFormat.ErrorFormat(logMessage));

        }

}

Step5: 格式化输出样式

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();

        }

    }

修改项目

修改上节新建的项目“Yak.Nlog.Api”,引用封装的“Yak.Nlog.Framework”程序集。

Step1:重写全局异常处理

public class CustomerGlobalExceptionFilterAsync : IAsyncExceptionFilter

    {

private readonly INLogHelper _logHelper;

public CustomerGlobalExceptionFilterAsync(INLogHelper logHelper)

        {

            _logHelper = logHelper;

        }

/// <summary>

/// 重新OnExceptionAsync方法

/// </summary>

/// <param name="context">异常信息</param>

/// <returns></returns>

public Task OnExceptionAsync(ExceptionContext context)

        {

// 如果异常没有被处理,则进行处理

if (context.ExceptionHandled == false)

            {

// 记录错误信息

                _logHelper.LogError(context.Exception);

// 设置为true,表示异常已经被处理了,其它捕获异常的地方就不会再处理了

                context.ExceptionHandled = true;

            }

return Task.CompletedTask;

        }

}

Step2: 修改类的ConfigureServices,注入HttpContextAccessor和 NLogHelper。

public void ConfigureServices(IServiceCollection services)

        {

#region 添加异常处理过滤器

            services.AddControllers(options => options.Filters.Add(typeof(CustomerGlobalExceptionFilterAsync)));

#endregion

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

            services.AddSingleton<INLogHelper, NLogHelper>();

            services.AddControllers();

        }

Step3:修改WeatherForecast控制器。

public IEnumerable<WeatherForecast> Get()

        {

            _logger.LogInformation("Hello, this is the GetWeatherForecast!");

            _logger.LogInformation("这是提示信息");

            _logger.LogError("测试封装日志");

int.Parse("asd");//抛出异常

var rng = new Random();

return Enumerable.Range(1, 5).Select(index => new WeatherForecast

            {

                Date = DateTime.Now.AddDays(index),

                TemperatureC = rng.Next(-20, 55),

                Summary = Summaries[rng.Next(Summaries.Length)]

            })

            .ToArray();

        }

运行结果

按Ctrl+F5快速运行。

生成了Log文件和按照格式打印出来Log。

wps307

总结

接口服务运行后,因为“int.Parse("asd");”抛出异常,最后在全局异常处理程序中处理并格式化打印出来。

由于是.NET Web项目,所以没必要下载全部的Nlog包,下载对应的Nlog.Web.AspNetCore即可,当然下载Nlog包也是可以的,按需引入。

鸣谢

https://blog.csdn.net/qq_40732336/article/details/112070628?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3

源码

https://github.com/yandaniugithub/NETCore

posted @ 2022-05-02 20:09  春光牛牛  阅读(370)  评论(0编辑  收藏  举报