如何向Microsoft.Extensions.Logging事件添加跨领域信息?

时间:2018-11-21 09:41:45

标签: c# logging asp.net-core-2.0 seq

我正在尝试使用ASP.NET Core 2.0建立客户端-服务器应用程序的基本原型。作为此过程的一部分,我正在向Seq发送诊断信息。在每个应用程序的Startup类中,我使用Seq.Extensions.Logging并按以下方式配置Seq接收器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(builder =>
    {
        builder
            .SetMinimumLevel(LogLevel.Debug)
            .AddSeq();
    });

这有效;所有事件均出现在Seq中。但是,不可能轻松地区分任何特定事件来自哪个应用程序。

过去,我可以使用Serilog向记录器添加属性,这些属性包含在每个事件中。通常,我会将应用程序的名称和运行它的主机添加为一对附加属性:

Log.Logger = new LoggerConfiguration()
    .Enrich.WithMachineName()
    // ...other configuration...
    .CreateLogger();

是否可以将Microsoft日志记录扩展名配置为执行相同的操作?

1 个答案:

答案 0 :(得分:0)

有两种选择。

  1. 使用内置的Seq功能。

    对于Seq,它提供API Keys,用于标识客户端应用程序。您可以添加诸如项目名称之类的特定名称的Applied properties,并通过

    配置api密钥。
            services.AddLogging(loggingBuilder =>
        {
            loggingBuilder.AddSeq(Configuration.GetSection("Seq"));
        });
    

            services.AddLogging(loggingBuilder =>
        {                
            loggingBuilder.AddSeq("http://xxx:5341", apiKey: "K5HzACIfiQxr67CKlvUj");
        });
    
  2. 使用Serialog来配置输出模板,例如

            var output = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message} {ActionName} {UserName} {NewLine}{Exception} {MachineName}";
    
        Log.Logger = new LoggerConfiguration()
               .Enrich.FromLogContext() // Populates a 'User' property on every log entry
               .Enrich.WithProperty("MachineName", Environment.MachineName) //new field
               .WriteTo.RollingFile("Logs/app-{Date}.txt", outputTemplate: output)
               .WriteTo.Seq("http://xxx:5341",apiKey: "K5HzACIfiQxr67CKlvUj")
               .CreateLogger();
        loggerFactory
            //.AddFile("Logs/app-{Date}.txt")
            .AddSerilog();