【问题标题】:How to overwrite application name specified in appsettings.json when using Serilog?使用 Serilog 时如何覆盖 appsettings.json 中指定的应用程序名称?
【发布时间】:2020-03-27 08:51:33
【问题描述】:

我的 appsettings.json 看起来像这样:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.File" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {

              "Name": "File",
              "Args": {

                "path": "%APPDATA%\\FancyProject\\logs\\RR.log",
                "formatter": "Serilog.Formatting.Json.JsonFormatter",
                "rollingInterval": "Day",
                "retainedFileCountLimit": 20,
                "buffered": false
              }
            }
          ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithExceptionDetails" ],
    "Properties": {
      "Application": "SampleName"
    }
  }
}

加载设置:

var configuration = new ConfigurationBuilder()
                        .AddJsonFile("appsettings.json")
                        .Build();

Log.Logger = new LoggerConfiguration()
                 .ReadFrom.Configuration(configuration)
                 .CreateLogger();

我想在我的解决方案中为多个项目使用相同的配置文件,但使用不同的应用程序名称以区分服务。

有没有办法在加载配置时更改代码中的应用程序名称(我的配置中的“SampleName”)?

【问题讨论】:

  • 上面的配置怎么用,是asp.net core app吗?
  • @PavelAnikhouski 这是一个 .NET 4.6.2 应用程序
  • 但是appsettings.json 是针对 .NET Core 应用的,你可能应该在这里使用基于 xml 的配置
  • @PavelAnikhouski Serilog.Settings.Configuration 可从 .NET 4.6.1 获得。我添加了用于加载 appsettings.json 的代码。
  • @PavelAnikhouski 感谢您的代码。它有效并解决了我的问题。你介意转发一下吗?

标签: c# logging .net-core serilog


【解决方案1】:

IConfiguration接口可以使用下面的扩展方法,从appsettings.json读取配置实例后更新配置实例

public static class Ext
{
    public static IConfiguration ApplyAppName(this IConfiguration configuration, string appName)
    {
        foreach (var (key, _) in configuration.AsEnumerable())
            if (key.StartsWith("Serilog") && key.EndsWith("Application"))
                configuration[key] = appName;

        return configuration;
    }
}

并在配置和创建记录器之前以下列方式使用它(基于来自 GitHub 的 serilog-settings-configuration 示例)

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build()
    .ApplyAppName("MyApp");

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

或者,您可以在CreateHostBuilder 通话期间关注Serilog integration for ASP.NET Core 2+ 并使用带有上述ApplyAppName 扩展名的UseSerilog() 方法

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
        .UseSerilog((hostingContext, loggerConfiguration) =>
        {
            var config = hostingContext.Configuration.ApplyAppName("MyApp");
            loggerConfiguration.ReadFrom.Configuration(config);
        });

【讨论】:

    【解决方案2】:

    我通过从配置中删除属性部分并以这种方式加载它来解决它:

    Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .Enrich.WithProperty("ApplicationName", "my application")
                .CreateLogger();
    

    PavelAnikhouski 的(已删除)答案实际上是我问题的正确答案,但我认为直接添加正确的应用程序名称比修改占位符更干净。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多