.NET6之MiniAPI(十九):NLog
在本系例文章的第八篇中,我们聊过官方的日志实现,即《.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相关推荐
- .NET6之MiniAPI(十八):OpenAPI swagger
从本篇开始,介绍一些很不错的三方库,来丰富MiniAPI的使用. 在创建MiniAPI项目时,模板提供了一个是否启用OpenAPI的选项,足见这个三方库的优势和强大. OpenAPI为我们测试API提 ...
- .NET6之MiniAPI(十五):跨域CORS(下)
前一篇的跨域请求的方式是松宽的方式,毕竟跨域有安全风险,应尽量少的允许访问必要资源,本篇分别从请求方法,请求头和请求凭据方面了解跨域设置. 请求方法: api项目,get,post是默认访问,这里只设 ...
- .NET6之MiniAPI(十四):跨域CORS(上)
为了说明跨请求,创建了两个项目,一个mini api,端口是5001,另一个razor page项目,端口是5280.5280项目会在页面用ajax的方式来请求5001,形成跨域请求,由于是本地测试, ...
- .NET6之MiniAPI(十二):引入EntityFramewor
说明:本篇重点说明MiniAPI引入EntityFramework,EF的使用不是本篇的重点 本篇是在MiniAPI中使用EntityFramework,所以先奉上创建数据的脚本,数据库是SQL Se ...
- .NET6之MiniAPI(十六):数据保护
对于web,安全是一个永久的话题,所以ASP.NET Core数据保护提供了一个简单,易用的加密API,可以用来保护数据,密钥管理和轮换. ASP.NET Core的数据保护是根据本机的一个key来生 ...
- .NET6之MiniAPI(十):基于策略的身份验证和授权
JWT不管是基于角色,还是自定义策略,实现的步骤都是大同小异的,基于自定义策略的步骤如下: 1.appsettings.json中配置JWT参 2.添加身份认证和授权服务和中间件,并设置为策略模式和策 ...
- .NET6之MiniAPI(三十):结束篇(附链接)
不知不觉来到了<.NET6之MiniAPI>的第三十篇,回顾之前的篇幅,主要涉及如下: HTTP请求,应答 Request 桂素伟,公众号:桂迹.NET6之MiniAPI(二):reque ...
- 2021年大数据Hadoop(二十九):关于YARN常用参数设置
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...
- python第二十九课——文件读写(复制文件)
自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...
最新文章
- libpcap捕包机制分析(三)
- Android中的资源复用小技巧
- pta l2-6(树的遍历)
- 触发器及其应用实验报告总结_调机技巧总结: 先快后慢射胶法及其应用
- 前端学习(1909)vue之电商管理系统电商系统之渲染修改用户的请求
- num_workers设置
- TensorFlow入门(1)
- 使用快捷工具搜狗词库转txt和mmseg
- 重心法选址迭代matlab,配送中心重心法选址的研究
- Android联网失败报错:java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted
- 极限学习机(Extreme Learning Machine)(小白之路)
- 【各大公司年会奖品清单】腾讯送直升飞机,网易与日女星度过美好的下午?...
- CNCC2022将于12月重磅开启,聚焦算力、数据、生态三大主题
- Clannad(1)
- 58同城登陆参数password值,js解密
- CodeBlocks安装方法(Nightly Build版) 和几款高亮皮肤
- cad step格式转换为threejs支持的json格式
- 小白也能懂的可转债上市价格预测
- 学计算机写作文怎么写,新手怎样学电脑打字作文
- API 接口的安全性及鉴权方式
热门文章
- VSAN见证虚拟设备
- HDS业务定义永续IT架构
- 配置Windows 2008 R2 防火墙允许远程访问SQL Server 2008 R2 更改端口 连接字符串 IP+逗号+端口号...
- SQLite入门之数据类型
- SWF反编译神器ASV2013功能展示(下)
- (转)WebSphere的web工程中怎么获取数据源
- Oracle数据库查询用 where in 查询的项超过1000条的解决方案
- java servlet练习测试
- 一个关于导出excel模板的实例
- [中文版] 可视化 CSS References 文档