经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.Net Core 使用 TagProvider 与 Enricher 丰富日志
来源:cnblogs  作者:chester·chen  时间:2024/3/19 9:42:35  对本文有异议

TagProvider 

[LogProperties] 与 [LogPropertyIgnore] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱。

您可能不希望因日志记录问题而使您的域模型变得混乱。对于这种情况,可以使用[TagProvider]属性来丰富日志。

我们仍然使用前面用的Network实体,这次它不再使用[LogPropertyIgnore]属性:

  1. public class NetWorkInfo
  2. {
  3. public string IPAddress { get; set; }
  4. public int Port { get; set; }
  5. }

 

相反,我们定义了一个专用的“TagProvider”实现。

不需要实现接口或任何类,只需要正确的方法格式。

下面是我们给Network对象的标签提供程序,我们只记录字段IPAddres字段,如下所示:

  1. internal static class NetWorkInfoTagProvider
  2. {
  3. // ?? Has the required signature 'void RecordTags(ITagCollector, T)'
  4. public static void RecordTags(ITagCollector collector, NetWorkInfo network)
  5. {
  6. // You can add aribrtrary objects to be logged.
  7. // You provide a key (first arg) and a value.
  8. collector.Add(nameof(NetWorkInfo.IPAddress), network.IPAddress);
  9. }
  10. }

 

定义标签提供程序后,我们现在可以在日志记录方法中使用它。

将属性替换[LogProperties]为[TagProvider]如下所示的属性:

  1. public static partial class Log
  2. {
  3. [LoggerMessage(
  4. EventId = 0,
  5. Level = LogLevel.Error,
  6. Message = "Can not open SQL connection {err}")]
  7. public static partial void CouldNotOpenConnection(this ILogger logger, string err,
  8. [TagProvider(typeof(NetWorkInfoTagProvider), nameof(NetWorkInfoTagProvider.RecordTags))] NetWorkInfo netWork);
  9. }

 

按正常方式调用即可,可以看到Network.IPAddress已经记录到日志的State属性中。

  1. private static async Task Main(string[] args)
  2. {
  3. using ILoggerFactory loggerFactory = LoggerFactory.Create(
  4. builder =>
  5. builder.AddJsonConsole(
  6. options =>
  7. options.JsonWriterOptions = new JsonWriterOptions()
  8. {
  9. Indented = true
  10. }));
  11. ILogger logger = loggerFactory.CreateLogger("Program");
  12. logger.CouldNotOpenConnection("network err", new NetWorkInfo { IPAddress = "123.1.1", Port = 7777 });
  13. }

 

 

Enricher 

Microsoft.Extensions.Telemetry包可以像Serilog一样丰富日志。首先添加Nuget包

  1. <PackageReference Include="Microsoft.Extensions.Telemetry" Version="8.3.0" />

 

首先使用方法ILoggingBuilder.EnableEnrichment()启用全局丰富,并通过AddProcessLogEnricher将进程的日志信息添加到日志中。

  1. builder.Logging.AddJsonConsole(options =>
  2. options.JsonWriterOptions = new JsonWriterOptions()
  3. {
  4. Indented = true
  5. }
  6. );
  7. builder.Logging.EnableEnrichment(); // Enable log enrichment
  8. builder.Services.AddProcessLogEnricher(x =>
  9. {
  10. x.ProcessId = true; // Add the process ID (true by default)
  11. x.ThreadId = true; // Add the managed thread ID (false by default)
  12. });

 

也可以通过metadata自定义使用的字段

  1. builder.Services.AddServiceLogEnricher(options =>
  2. {
  3. options.ApplicationName = true; // Choose which values to add to the logs
  4. options.BuildVersion = true;
  5. options.DeploymentRing = true;
  6. options.EnvironmentName = true;
  7. });
  8. builder.Services.AddApplicationMetadata(x =>
  9. {
  10. x.ApplicationName = "My App";
  11. x.BuildVersion = "1.2.3";
  12. x.EnvironmentName = "Development";
  13. x.DeploymentRing = "test";
  14. });

 

这些内置的丰富器很方便,但也可以创建自定义的实现。

 

自定义LogEnricher

您可以通过从或接口IStaticLogEnricher和ILogEnricher派生创建自己的丰富器

  • IStaticLogEnricher: IStaticLogEnricher—是全局的enricher,如果日志在整个声明周期中不变则可将其标签添加到记录器中。
  • ILogEnricher- 每次写入日志时都会调用丰富器,这对于可能更改的值非常有用。

我们将创建一个简单的IStaticLogEnricher,将当前计算机名称添加到日志中,另外创建一个ILogEnricher,将当前用户Id添加到日志中。

  1. internal class MachineNameEnricher : IStaticLogEnricher
  2. {
  3. public void Enrich(IEnrichmentTagCollector collector)
  4. {
  5. collector.Add("MachineName", Environment.MachineName);
  6. }
  7. }
  8. internal class UserIdEnricher : ILogEnricher
  9. {
  10. public void Enrich(IEnrichmentTagCollector collector)
  11. {
  12. collector.Add("UserId", Guid.NewGuid().ToString());
  13. }
  14. }
  15. builder.Logging.EnableEnrichment(); // Enable log enrichment
  16. builder.Services.AddStaticLogEnricher<MachineNameEnricher>();
  17. builder.Services.AddLogEnricher<UserIdEnricher>();

 

 

原文链接:https://www.cnblogs.com/chenyishi/p/18081945

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号