c# - 使用 Serilog 时如何覆盖 appsettings.json 中指定的应用程序名称?

标签 c# logging .net-core serilog

我的 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”)?

最佳答案

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

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;
    }
}

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

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

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

或者,您可以关注 Serilog integration for ASP.NET Core 2+ 并使用 UseSerilog()上述方法ApplyAppName CreateHostBuilder期间的延期称呼

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);
        });

关于c# - 使用 Serilog 时如何覆盖 appsettings.json 中指定的应用程序名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60882667/

相关文章:

c# - 如何创建或使用现成的垫片从 .net 框架移植到 .net 核心/标准?

c# - 如何确定图像是否包含使用特定颜色?

c# - 将配置传递给 IHostedService

c# - DbContextOptionsBuilder 找不到 ASP.NET Core 1.1 Web API 项目

c# - 在 project.json 的 .NET Core 中选择 .dll 和 .exe

c# - 新的 .csproj 格式 - 如何将整个目录指定为子目录的 "linked file"?

c# - 使用泛型但没有基类的工厂类

java - Powermock : Mocking static final logger

java - 如何禁用 mongoDB java 驱动程序日志记录?

c++ - Boost.Log - 如何使用附加和旋转配置 text_file_backend