NLog之封装
前言
在上节“NLog之快速入门”简单认识了Nlog,这节讲述将Nlog封装成程序集使用。
环境
- l Win10
- l VS2022
- l .NET5.0
项目实践
在上节“NLog之快速入门”项目基础上改造。项目如下:
新建项目
新建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。
总结
接口服务运行后,因为“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
源码
本文来自博客园,作者:{春光牛牛,yak},转载请注明原文链接:https://www.cnblogs.com/yakniu/p/16216678.html
欢迎各位大佬们评论指正
QQ讨论群:610129902
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库