欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.Net?Core?使用?TagProvider?與?Enricher?豐富日志的操作代碼

 更新時間:2024年03月19日 09:20:57   作者:chester·chen  
這篇文章主要介紹了.Net?Core?使用?TagProvider?與?Enricher?豐富日志的操作,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下

TagProvider 

[LogProperties] 與 [LogPropertyIgnore] 如果用在DTO不存在任何問題,如果用在Domain實體上,可能有點混亂。

您可能不希望因日志記錄問題而使您的域模型變得混亂。對于這種情況,可以使用[TagProvider]屬性來豐富日志。

我們?nèi)匀皇褂们懊嬗玫腘etwork實體,這次它不再使用[LogPropertyIgnore]屬性:

public class NetWorkInfo
{
    public string IPAddress { get; set; }
    public int Port { get; set; }
}

相反,我們定義了一個專用的“TagProvider”實現(xiàn)。

不需要實現(xiàn)接口或任何類,只需要正確的方法格式。

下面是我們給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);
    }
}

定義標簽提供程序后,我們現(xiàn)在可以在日志記錄方法中使用它。

將屬性替換[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);
}

按正常方式調(diào)用即可,可以看到Network.IPAddress已經(jīng)記錄到日志的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";
});

這些內(nèi)置的豐富器很方便,但也可以創(chuàng)建自定義的實現(xiàn)。

自定義LogEnricher

您可以通過從或接口IStaticLogEnricher和ILogEnricher派生創(chuàng)建自己的豐富器

  • IStaticLogEnricher: IStaticLogEnricher—是全局的enricher,如果日志在整個聲明周期中不變則可將其標簽添加到記錄器中。
  • ILogEnricher- 每次寫入日志時都會調(diào)用豐富器,這對于可能更改的值非常有用。

我們將創(chuàng)建一個簡單的IStaticLogEnricher,將當前計算機名稱添加到日志中,另外創(chuàng)建一個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>();

到此這篇關(guān)于.Net Core 使用 TagProvider 與 Enricher 豐富日志的文章就介紹到這了,更多相關(guān).Net Core 使用 TagProvider 與 Enricher內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論