.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": "*"
}

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

控制台结果

7e2666e4591e6c675e60c2d6dc6dab95.png

2022-02-20.json结果

e38da500aac657ea296ae7425978b14f.png

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

b8abbab9f77c63cb76145ed307040fac.png

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

a0fdf405406a07d44dc1f5a232a5917f.png

7f9132f50124366b10813bb5535778ce.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql-proxy

yum -y install mysql-proxy#mysql-proxy?--daemon?--log-leveldebug?--log-file/var/log/mysql-proxy.log?-P?10.254.157.xxx:3310(本机内网IP,端口自己随意设置)?--proxy-backend-addresses10.137.192.xxx:3306&#xff08;rds内网IP&#xff09; 您看下这几个步骤 是…

字符串倒序

#include "stdafx.h" #include <stdio.h>#include "t11.h" #include <string.h> #include <stdlib.h>//以下代码是把一个字符串倒序 int t11() {char* src "1234567890";int len strlen(src);char* dest (char*)malloc(len…

html地区三级联下拉列表,JS-三级联下拉列表

/p>var types"家电,服饰,家具,日用";var types_str1"电视机,洗衣机,电冰箱,空调|外套,衬衣,大衣,裤子|书桌,书柜,饭桌,衣柜|清洁,洗发,纸品,厨房";var types_str2"索尼,海信,康佳,飞利浦^海尔,LG,三星^海尔,飞利浦,韩电^格力,美的,海尔,长虹"…

Android ndk之Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret

1、问题 编译ndk里面的子模块的时候出现这个错误 Android ndk Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret 2、解决办法 是因为编译模块依赖libsfk.so这个文件&#xff0c;所以把这个文件拷贝到这个编译的模块就可以执行 ndk-build succe…

完美:C# Blazor中显示Markdown并添加代码高亮

昨天发了一篇介绍这个库&#xff1a;C# Blazor中显示Markdown文件&#xff0c;介绍怎么在Blazor中显示Markdown内容的文章&#xff0c;文章内的代码是没有高亮的&#xff0c;思来相去&#xff0c;还是要做好&#xff0c;于是百度到这篇文章.NET C# Blazor 服务端渲染Markdown&a…

微服务架构成功之路

本文来源于我在InfoQ中文站翻译的文章&#xff0c;原文地址是&#xff1a;http://www.infoq.com/cn/news/2015/07/success-of-microservices近年来&#xff0c;在软件开发领域关于微服务的讨论呈现出火爆的局面&#xff0c;有人倾向于在系统设计与开发中採用微服务方式实现软件…

读《一个程序猿的生命周期》有感

《一个程序猿的生命周期》中的作者来自贫困家庭&#xff0c;可以说是一个从大山里走出来的人。他深知&#xff0c;只有刻苦学习才能改变现状&#xff0c;所以他学习非常努力。 但人生总不是这样一帆风顺的&#xff0c;总会在我们的人生路上给与我们一些打击。意想不到的事情发生…

ymPrompt

ymPrompt消息提示组件4.0 组件调用方式1(传统参数传入方式)&#xff1a;示例调用方法 ymPrompt.alert(http://www.qq.com,null,null,确认要提交吗?,handler) ymPrompt.succeedInfo(document.getElementById(txt).innerHTML,400,260,null,handler2) ymPrompt.errorInfo(操作失败…

html点击关闭代码,怎样开放和关闭html代码?

如何使ASP输出结果不支持html语法&#xff1f;整理编辑&#xff1a;China ASP网友aspboy1原创有时候我们会为这样一个问题而烦恼,就是如何在asp页面中避免支持html语法.例如: 下面一句话"这是一个表单语句"当我们在ASP文件中用response.write"这是一个表单语句&…

linux之如何复制文件夹所有文件到其它文件夹

1、复制文件夹所有文件到其他文件夹 比如复制文件夹test1里面的所有文件到文件夹test2里面去,test1和test2都在同一个路径下面 cd test1cp * ../test2/ 如果是复制文件夹里面的所有内容到另外一个文件夹 cp -rf Android/* ../../chenyu/ 2、如果解决一开始运行项目没问题&…

使用 FieldMask 提高 C# gRpc 服务性能

前言想象一下&#xff0c;有一个服务提供个多个客户端调用&#xff0c;但不是所有客户端都需要全部的返回参数:比如商品列表服务返回商品的所有信息&#xff0c;而订单服务调用商品列表服务&#xff0c;但它其实只需要商品的编码和名称就够了。当然&#xff0c;我们可以为这个需…

HTML accesskey 属性

2019独角兽企业重金招聘Python工程师标准>>> 带有指定快捷键的超链接&#xff1a; <a href"http://www.w3school.com.cn/html/" accesskey"h">HTML</a><br /> <a href"http://www.w3school.com.cn/css/" access…

python 生成排列、组合以及选择

from <python cookbook> 19.15 任务 需要对一个序列的排列&#xff08;permutation&#xff09;、组合&#xff08;combination&#xff09;或选择&#xff08;selection&#xff09;进行迭代操作。即使初始的序列长度并不长&#xff0c;组合计算的规则却显示生成的序列可…

html5制作线路图,HTML5绘制上海地铁线路图

某市政项目用到地铁图展示&#xff0c;展示地铁站点以及相关信息流&#xff0c;使用Qunee组件可以很好的解决这类需求&#xff0c;做出优美的展现&#xff0c;下面以上海2012地铁图为例&#xff0c;效果如下&#xff1a;上海2012地铁图效果示例讲解首先需要解决数据问题&#x…

Cocos2d-x VS. OGEngine,联盟与部落的战争

在近期的全球移动开发者大会上&#xff0c;Unity发布了2D引擎&#xff0c;触控在同时发布了Cocos 3D引擎&#xff1b;而在差不多同时间&#xff0c;以安卓为主的OGEngine也发布了新版本&#xff0c;并宣布将支持跨平台。各大引擎频频大动作并不是巧合&#xff0c;这代表着移动游…

Android之获取设备的型号和手机厂商

1. 获取手机型号&#xff1a; String model android.os.Build.MODEL; 2. 获取手机厂商&#xff1a; String carrier android.os.Build.MANUFACTURER;

C#中的var理解

从 C# 3.0 开始&#xff0c;在方法范围内声明的变量可以具有隐式“类型”var。隐式类型本地变量为强类型&#xff0c;就像用户已经自行声明该类型&#xff0c;但编译器决定类型一样。i 的以下两个声明在功能上是等效的&#xff1a;var i 10; int i 10;var 关键字的常见用途是…

发布版本步骤

1&#xff0c;修改版本号 -eclipse中安卓工程的AndroidManifest.xml文件中修改 android:versionName"V1.0.1.170413.31"<日期-版本号1>2.获得软件APK &#xff0c;eclipse下windows-Android-build-取消勾选Atomatically refresh Force Skip packag…

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler) 分析

转会http://www.ibm.com/developerworks/cn/linux/l-completely-fair-scheduler/index.html?cadrs-cn-0125 Linux 调度器简史 早期的 Linux 调度器使用了最低的设计&#xff0c;它显然不关注具有非常多处理器的大型架构&#xff0c;更不用说是超线程了。1.2 Linux 调度器使用了…

在计算机技术方面用英语怎么说,“计算机应用技术”用英语怎么说?

计算机应用技术 :1. Computer Applications Technology中国搜学网-学苑论坛 - 教育话题 - 学习交流 ... ...专利文献检索 The Searches of Patent Literature计算机应用技术 Computer Applications Technology精密电磁测量 Precise Electromagnetic Measurement ...2. Computer…