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 丰富日志的更多相关文章

  1. [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件

    本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...

  2. ASP.NET Core 开发-Logging 使用NLog 写日志文件

    ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 .NET Core 和 ASP.NET Core . ASP.NET Core已经内置了日志支持,可以 ...

  3. [.Net Core] 在 Mvc 中简单使用日志组件

    在 Mvc 中简单使用日志组件 基于 .Net Core 2.0,本文只是蜻蜓点水,并非深入浅出. 目录 使用内置的日志组件 简单过渡到第三方组件 - NLog 使用内置的日志 下面使用控制器 Hom ...

  4. ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  5. NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...

  6. .NET Core使用NLog通过Kafka实现日志收集

    微服务日志之.NET Core使用NLog通过Kafka实现日志收集 https://www.cnblogs.com/maxzhang1985/p/9522017.html 一.前言 NET Core ...

  7. 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 中,执行该操作的另一种方法 ...

  8. .net core中的那些常用的日志框架(NLog篇)

    前言 咱们上回讲到,.net core中内置的Logging日志框架的使用,以及浅显的讲解,接下来,给大家介绍一个第三方日志框架(NLog). NLog简介 NLog是适用于各种.NET平台(包括.N ...

  9. .net core中的那些常用的日志框架(Serilog篇)

    前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...

  10. .NET Core集成CorrelationId实现全链路日志输出

    .NET Core集成CorrelationId实现全链路日志输出 一,链路追踪 随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当 ...

随机推荐

  1. 《ASP.NET Core 微服务实战》-- 读书笔记(第6章)

    第 6 章 事件溯源与 CQRS 在本章,我们来了解一下随着云平台一同出现的设计模式 我们先探讨事件溯源和命令查询职责分离(CQRS)背后的动机与哲学 事件溯源简介 事实由事件溯源而来 我们大脑就是一 ...

  2. MySQL的CTE(公用表表达式)

    (一)概念 MySQL的CTE是在MySQL8.0版本开始支持的,公用表表达式是一个命名的临时结果集,仅在单个SQL语句(例如select.insert.delete和update)的执行范围内存在. ...

  3. Pandas resample数据重采样

    随机抽样,是统计学中常用的一种方法,它可以帮助我们从大量的数据中快速地构建出一组数据分析模型.在 Pandas 中,如果想要对数据集进行随机抽样,需要使用 sample() 函数. sample() ...

  4. java 从零开始手写 RPC (06) reflect 反射实现通用调用之客户端

    通用调用 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 java 从零开始手写 RPC (03) 如何 ...

  5. MySQL8.0使用mysqlsh配置主从复制 InnoDB ReplicaSet

    InnoDB ReplicaSet InnoDB ReplicaSet 由一个主节点和多个从节点构成. 可以使用ReplicaSet对象和AdminAPI操作管理复制集, 例如检查InnoDB复制集的 ...

  6. MyBatis实现多行合并(collection标签使用)

    举个栗子 现有如下表结构,用户表.角色表.用户角色关联表. 一个用户有多个角色,一个角色有可以给多个用户,也即常见的多对多场景. 现有这样一个需求,分页查询用户数据,除了用户ID和用户名称字段,还要查 ...

  7. 【Android逆向】IDA动态调试JNI_OnLoad 和 .init_array

    由于 JNI_OnLoad 和 .init_array 执行时间很早,so一加载到内存中就执行了,所以动态调试步骤会稍微要麻烦一些 1. 进入手机, 执行./android_server (如果是64 ...

  8. Mqtt开发笔记:Mqtt服务器搭建

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  9. ContentType组件表使用

    https://www.shuzhiduo.com/A/qVdepN2r5P/

  10. 被 AI 替代应该就在不远的将来

    提问:golang 各种图片 转 webp 代码 一秒之后...... package main import ( "fmt" "image" "im ...