在本系例文章的第八篇中,我们聊过官方的日志实现,即《.NET6之MiniAPI(八):日志》。但官方的日志功能更多是提供了一个实现基础,对于要求一个灵活,强大,方便的日志体系,官方的还是有差距的,那么本篇就介绍一下NLog,这款强大,灵活,方便的日志库,在MiniAPI中的使用。

直入主题,首先引入NeGut包

NLog.Web.AspNetCore

添加代码实现很简单

using NLog;
using NLog.Web;//启动日志
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Debug("init main");
try
{var builder = WebApplication.CreateBuilder(args);//配置日志builder.Logging.ClearProviders();builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);builder.Host.UseNLog();var app = builder.Build();//使用日志app.MapGet("/logtest", () =>{app.Logger.LogTrace("LogTrace");app.Logger.LogDebug("LogDebug");app.Logger.LogWarning("LogWarning");app.Logger.LogInformation("LogInformation");app.Logger.LogError("LogError");app.Logger.LogCritical(new Exception("eLogCritical"), "LogCritical");return "logtest";});app.MapGet("/myvalue", MyService.GetMyValue);app.Run();
}
catch (Exception exception)
{//异常时处理日志logger.Fatal(exception, "Stopped program because of exception");
}
finally
{NLog.LogManager.Shutdown();
}class MyService
{public static string GetMyValue(ILogger<MyService> logger){logger.LogInformation("TestService.GetMyValue");return "MyValue";}
}

NLog的真正方便,在配置的丰富,通过配置灵活地实现不日志方式,不同信息项目的采集。NLog的配置以nlog.config文件名保存在项目根目录下,当然也可以通过修改启动日志的LoadConfigurationFramAppSettings来配置nlog.config路径。

配置主要通过targets节点和rules节点协助实现配置,targets主要是配置保存或显示日志的方式,是txt文件,还json文件,以及layout中日志的内容,具体target的属性,有很多,参见https://github.com/NLog/NLog/wiki/File-target。另外一个就是layout中,也就是将来的日志信息有那些元素,可参见https://nlog-project.org/config/?tab=layout-renderers。

rules主要是配置不同的功能模块,日志级别等信息,参见https://github.com/nlog/nlog/wiki/Configuration-file#rules。

下面的案例配置,实现了官方模板自带的allfile和ownFile-web两个txt格式的模板,和一个jsonfile的模板,同时还有一个彩色控制台模板(各个模板的属性,官方文档比较详细,这里就不展开了)

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"autoReload="true"internalLogLevel="Info"><!-- enable asp.net core layout renderers --><extensions><add assembly="NLog.Web.AspNetCore"/></extensions><!-- the targets to write to --><targets><!-- File Target for all log messages with basic details --><target xsi:type="File" name="allfile" fileName="${basedir}\logs\nlog-AspNetCore-all-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" /><!-- File Target for own log messages with extra web details using some ASP.NET core renderers --><target xsi:type="File" name="ownFile-web" fileName="${basedir}\logs\nlog-AspNetCore-own-${shortdate}.log"layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" /><!--json格式--><target name="jsonfile" xsi:type="File" fileName="${basedir}\logs\${shortdate}.json"><layout xsi:type="JsonLayout" includeAllProperties="true"><attribute name="time" layout="${date:format=O}" /><attribute name="message" layout="${message}" /><attribute name="logger" layout="${logger}"/><attribute name="level" layout="${level}"/><attribute name='exception' layout='${exception}' /><attribute name='request' encode='false'  ><layout type='JsonLayout'><attribute name="aspnet-request-ip" layout="${aspnet-request-ip}"/><attribute name="aspnet-Request-Url" layout="${aspnet-Request-Url}"/><attribute name="aspnet-Request-Host" layout="${aspnet-Request-Host}"/><attribute name="aspnet-Request-Method" layout="${aspnet-Request-Method}"/></layout></attribute></layout></target><!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection --><target xsi:type="ColoredConsole" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" ><highlight-row condition="level == LogLevel.Error" backgroundColor="NoChange" foregroundColor="NoChange"/><highlight-row condition="level == LogLevel.Fatal" backgroundColor="NoChange" foregroundColor="NoChange"/><highlight-row condition="level == LogLevel.Warn" backgroundColor="NoChange" foregroundColor="NoChange"/><highlight-word text="info" condition="level == LogLevel.Info" backgroundColor="NoChange" foregroundColor="Green" ignoreCase="true" regex="info" wholeWords="true" compileRegex="true"/><highlight-word text="warn" condition="level == LogLevel.Warn" backgroundColor="NoChange" foregroundColor="Yellow" ignoreCase="true" regex="warn" wholeWords="true" compileRegex="true"/><highlight-word text="fail" condition="level == LogLevel.Error" backgroundColor="NoChange" foregroundColor="Red" ignoreCase="true" regex="fail" wholeWords="true" compileRegex="true"/><highlight-word text="crit" condition="level == LogLevel.Fatal" backgroundColor="NoChange" foregroundColor="DarkRed" ignoreCase="true" regex="crit" wholeWords="true" compileRegex="true"/></target></targets><!-- rules to map from logger name to target --><rules><!--All logs, including from Microsoft--><logger name="*" minlevel="Trace" writeTo="allfile" /><!--Output hosting lifetime messages to console target for faster startup detection --><logger name="*" minlevel="Trace" writeTo="lifetimeConsole" /><!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) --><logger name="Microsoft.*" maxlevel="Info" final="true" /><logger name="System.Net.Http.*" maxlevel="Info" final="true" /><!--json格式--><logger name="*" minlevel="Trace" writeTo="jsonfile" /><logger name="*" minlevel="Trace" writeTo="ownFile-web" /></rules>
</nlog>

这里的appsettings.jsons配置如下

{"Logging": {"LogLevel": {"Default": "Trace","Microsoft.AspNetCore": "Trace"}},"AllowedHosts": "*"
}

根据配置,看看具体的实现效果:

控制台结果

2022-02-20.json结果

nlog-AspNetCore-own-2022-02-20.log结果

nlog-AspNetCore-all-2022-02-20.log结果

.NET6之MiniAPI(十九):NLog相关推荐

  1. .NET6之MiniAPI(十八):OpenAPI swagger

    从本篇开始,介绍一些很不错的三方库,来丰富MiniAPI的使用. 在创建MiniAPI项目时,模板提供了一个是否启用OpenAPI的选项,足见这个三方库的优势和强大. OpenAPI为我们测试API提 ...

  2. .NET6之MiniAPI(十五):跨域CORS(下)

    前一篇的跨域请求的方式是松宽的方式,毕竟跨域有安全风险,应尽量少的允许访问必要资源,本篇分别从请求方法,请求头和请求凭据方面了解跨域设置. 请求方法: api项目,get,post是默认访问,这里只设 ...

  3. .NET6之MiniAPI(十四):跨域CORS(上)

    为了说明跨请求,创建了两个项目,一个mini api,端口是5001,另一个razor page项目,端口是5280.5280项目会在页面用ajax的方式来请求5001,形成跨域请求,由于是本地测试, ...

  4. .NET6之MiniAPI(十二):引入EntityFramewor

    说明:本篇重点说明MiniAPI引入EntityFramework,EF的使用不是本篇的重点 本篇是在MiniAPI中使用EntityFramework,所以先奉上创建数据的脚本,数据库是SQL Se ...

  5. .NET6之MiniAPI(十六):数据保护

    对于web,安全是一个永久的话题,所以ASP.NET Core数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换. ASP.NET Core的数据保护是根据本机的一个key来生 ...

  6. .NET6之MiniAPI(十):基于策略的身份验证和授权

    JWT不管是基于角色,还是自定义策略,实现的步骤都是大同小异的,基于自定义策略的步骤如下: 1.appsettings.json中配置JWT参 2.添加身份认证和授权服务和中间件,并设置为策略模式和策 ...

  7. .NET6之MiniAPI(三十):结束篇(附链接)

    不知不觉来到了<.NET6之MiniAPI>的第三十篇,回顾之前的篇幅,主要涉及如下: HTTP请求,应答 Request 桂素伟,公众号:桂迹.NET6之MiniAPI(二):reque ...

  8. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  9. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...

最新文章

  1. libpcap捕包机制分析(三)
  2. Android中的资源复用小技巧
  3. pta l2-6(树的遍历)
  4. 触发器及其应用实验报告总结_调机技巧总结: 先快后慢射胶法及其应用
  5. 前端学习(1909)vue之电商管理系统电商系统之渲染修改用户的请求
  6. num_workers设置
  7. TensorFlow入门(1)
  8. 使用快捷工具搜狗词库转txt和mmseg
  9. 重心法选址迭代matlab,配送中心重心法选址的研究
  10. Android联网失败报错:java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted
  11. 极限学习机(Extreme Learning Machine)(小白之路)
  12. 【各大公司年会奖品清单】腾讯送直升飞机,网易与日女星度过美好的下午?...
  13. CNCC2022将于12月重磅开启,聚焦算力、数据、生态三大主题
  14. Clannad(1)
  15. 58同城登陆参数password值,js解密
  16. CodeBlocks安装方法(Nightly Build版) 和几款高亮皮肤
  17. cad step格式转换为threejs支持的json格式
  18. 小白也能懂的可转债上市价格预测
  19. 学计算机写作文怎么写,新手怎样学电脑打字作文
  20. API 接口的安全性及鉴权方式

热门文章

  1. VSAN见证虚拟设备
  2. HDS业务定义永续IT架构
  3. 配置Windows 2008 R2 防火墙允许远程访问SQL Server 2008 R2 更改端口 连接字符串 IP+逗号+端口号...
  4. SQLite入门之数据类型
  5. SWF反编译神器ASV2013功能展示(下)
  6. (转)WebSphere的web工程中怎么获取数据源
  7. Oracle数据库查询用 where in 查询的项超过1000条的解决方案
  8. java servlet练习测试
  9. 一个关于导出excel模板的实例
  10. [中文版] 可视化 CSS References 文档