.Net Core 使用 TagProvider 与 Enricher 丰富日志
TagProvider
[LogProperties] 与 [LogPropertyIgnore] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱。
您可能不希望因日志记录问题而使您的域模型变得混乱。对于这种情况,可以使用[TagProvider]属性来丰富日志。
我们仍然使用前面用的Network实体,这次它不再使用[LogPropertyIgnore]属性:
public class NetWorkInfo
{
public string IPAddress { get; set; }
public int Port { get; set; }
}
相反,我们定义了一个专用的“TagProvider”实现。
不需要实现接口或任何类,只需要正确的方法格式。
下面是我们给Network对象的标签提供程序,我们只记录字段IPAddres字段,如下所示:
internal static class NetWorkInfoTagProvider
{
// Has the required signature 'void RecordTags(ITagCollector, T)'
public static void RecordTags(ITagCollector collector, NetWorkInfo network)
{
// You can add aribrtrary objects to be logged.
// You provide a key (first arg) and a value.
collector.Add(nameof(NetWorkInfo.IPAddress), network.IPAddress);
}
}
定义标签提供程序后,我们现在可以在日志记录方法中使用它。
将属性替换[LogProperties]为[TagProvider]如下所示的属性:
public static partial class Log
{
[LoggerMessage(
EventId = 0,
Level = LogLevel.Error,
Message = "Can not open SQL connection {err}")]
public static partial void CouldNotOpenConnection(this ILogger logger, string err,
[TagProvider(typeof(NetWorkInfoTagProvider), nameof(NetWorkInfoTagProvider.RecordTags))] NetWorkInfo netWork);
}
按正常方式调用即可,可以看到Network.IPAddress已经记录到日志的State属性中。
private static async Task Main(string[] args)
{
using ILoggerFactory loggerFactory = LoggerFactory.Create(
builder =>
builder.AddJsonConsole(
options =>
options.JsonWriterOptions = new JsonWriterOptions()
{
Indented = true
})); ILogger logger = loggerFactory.CreateLogger("Program"); logger.CouldNotOpenConnection("network err", new NetWorkInfo { IPAddress = "123.1.1", Port = 7777 });
}

Enricher
Microsoft.Extensions.Telemetry包可以像Serilog一样丰富日志。首先添加Nuget包
<PackageReference Include="Microsoft.Extensions.Telemetry" Version="8.3.0" />
首先使用方法ILoggingBuilder.EnableEnrichment()启用全局丰富,并通过AddProcessLogEnricher将进程的日志信息添加到日志中。
builder.Logging.AddJsonConsole(options =>
options.JsonWriterOptions = new JsonWriterOptions()
{
Indented = true
}
);
builder.Logging.EnableEnrichment(); // Enable log enrichment
builder.Services.AddProcessLogEnricher(x =>
{
x.ProcessId = true; // Add the process ID (true by default)
x.ThreadId = true; // Add the managed thread ID (false by default)
});
也可以通过metadata自定义使用的字段
builder.Services.AddServiceLogEnricher(options =>
{
options.ApplicationName = true; // Choose which values to add to the logs
options.BuildVersion = true;
options.DeploymentRing = true;
options.EnvironmentName = true;
});
builder.Services.AddApplicationMetadata(x =>
{
x.ApplicationName = "My App";
x.BuildVersion = "1.2.3";
x.EnvironmentName = "Development";
x.DeploymentRing = "test";
});

这些内置的丰富器很方便,但也可以创建自定义的实现。
自定义LogEnricher
您可以通过从或接口IStaticLogEnricher和ILogEnricher派生创建自己的丰富器
- IStaticLogEnricher: IStaticLogEnricher—是全局的enricher,如果日志在整个声明周期中不变则可将其标签添加到记录器中。
- ILogEnricher- 每次写入日志时都会调用丰富器,这对于可能更改的值非常有用。
我们将创建一个简单的IStaticLogEnricher,将当前计算机名称添加到日志中,另外创建一个ILogEnricher,将当前用户Id添加到日志中。
internal class MachineNameEnricher : IStaticLogEnricher
{
public void Enrich(IEnrichmentTagCollector collector)
{
collector.Add("MachineName", Environment.MachineName);
}
} internal class UserIdEnricher : ILogEnricher
{
public void Enrich(IEnrichmentTagCollector collector)
{
collector.Add("UserId", Guid.NewGuid().ToString());
}
} builder.Logging.EnableEnrichment(); // Enable log enrichment
builder.Services.AddStaticLogEnricher<MachineNameEnricher>();
builder.Services.AddLogEnricher<UserIdEnricher>();

.Net Core 使用 TagProvider 与 Enricher 丰富日志的更多相关文章
- [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件
本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...
- ASP.NET Core 开发-Logging 使用NLog 写日志文件
ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 .NET Core 和 ASP.NET Core . ASP.NET Core已经内置了日志支持,可以 ...
- [.Net Core] 在 Mvc 中简单使用日志组件
在 Mvc 中简单使用日志组件 基于 .Net Core 2.0,本文只是蜻蜓点水,并非深入浅出. 目录 使用内置的日志组件 简单过渡到第三方组件 - NLog 使用内置的日志 下面使用控制器 Hom ...
- ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...
- NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...
- .NET Core使用NLog通过Kafka实现日志收集
微服务日志之.NET Core使用NLog通过Kafka实现日志收集 https://www.cnblogs.com/maxzhang1985/p/9522017.html 一.前言 NET Core ...
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
- .net core中的那些常用的日志框架(NLog篇)
前言 咱们上回讲到,.net core中内置的Logging日志框架的使用,以及浅显的讲解,接下来,给大家介绍一个第三方日志框架(NLog). NLog简介 NLog是适用于各种.NET平台(包括.N ...
- .net core中的那些常用的日志框架(Serilog篇)
前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...
- .NET Core集成CorrelationId实现全链路日志输出
.NET Core集成CorrelationId实现全链路日志输出 一,链路追踪 随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当 ...
随机推荐
- 《ASP.ENT Core 与 RESTful API 开发实战》-- (第4章)-- 读书笔记(上)
第 4 章 资源操作 4.1 项目创建 从本章起,我们将创建一个在线图书馆项目,通过这个 Web API 应用程序来实际地熟悉并掌握如何使用 ASP.NET Core 创建 RESTful API 应 ...
- 基于python+mysql的宠物领养网站系统
功能介绍 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发. 整个平台包括前台和后台两个部分. 前台功能包括:首页.宠物详情页.用户中心模块. 后台功能包 ...
- STM32F103和STM32F401的ADC多通道采集DMA输出
使用STM32F103和STM32F401CCU6对双轴摇杆(两个电压通道)进行ADC采样并通过DMA读取数值 STM32 ADC(模数转换)工作模式 单次转换模式 In Single Convers ...
- OneCloud记录
配置信息 S805, 1G RAM, 8G ROM, USB2.0 * 2, 1GB LAN, SD Cardreader S805参数: 32-bit, ARMv7-A, Cortex-A5, 1. ...
- Innodb存储引擎的文件
目录 概述 参数文件 日志文件 错误日志 慢查询日志 查询日志 二进制日志 binary log 二进制日志的配置 二进制日志的作用 二进制日志的保存 socket 套接字文件 pid文件 MySQL ...
- leetcode - 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入:p = [1,2,3], q = [1 ...
- java图书管理系统
一 .需求 1.使用数组存储学生(学号.姓名.性别.年级.院系.班级)信息数据和图书(书号.书名.出版日期.作者.价格.类别)信息数据 2.学生管理功能:增加学生.删除学生信息.修改学生信息.查询学生 ...
- AI开发之路
常见报错解决 Dilb库安装的三种方法 yolov5项目cuda错误解决 环境准备 Anaconda-用conda创建python虚拟环境 Python-pip创建虚拟环境 jupyter noteb ...
- Linux开端---Centos
Linux-Centos 虚拟化所需工具:https://pan.baidu.com/s/1643-kYcx9oPGnGEZM1pLOw?pwd=g0v5 提取码:g0v5 问题解决 正常注册网络适配 ...
- linux基本知识汇总2(系统编程) 60000字汇总
/////////////进程/任务 -- task任何启动并运行程序的行为,都是由操作系统帮助我们将程序转换成进程 -- 进程:完成特定的任务 进程控制块:PCB(win) / task_struc ...