Serilog 在 asp.net 核心 2.2 API 中的配置不工作

Serilog not working from configuration in asp.net core 2.2 API

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
           .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
           .UseStartup<Startup>();
}


public class Startup
{
    public IContainer Container { get; private set; }
    public Startup(IConfiguration configuration)
    {
        Log.Warning("test");
        Configuration = configuration;
    }

}

appsettings.json

{
    "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Default": "Information",
        "Microsoft": "Information",
        "System": "Information"
      }
    },
    "WriteTo": [

      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "C:\test.txt",
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
          "restrictedToMinimumLevel": "Information"
        }
      }
    ]
  },

  "AllowedHosts": "*"
}

我已经安装了所有的软件包

您的配置适用于 RollingFile,但您的软件包列表显示 Serilog.Sinks.File。这些是不同的。您需要添加 Serilog.Sinks.RollingFile 包,它应该会开始工作。

如果你想使用 File 接收器(正如@Kirk 在评论中提到的,现在是推荐的选项)那么你需要将设置更改为

"WriteTo": [
    {
        "Name": "File",
        "Args": {
            "path": "C:\test.txt",
            "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.ffff}|{TenantName}|{RequestId}|{SourceContext}|{Level:u3}|{Message:lj}{NewLine}{Exception}",
            "restrictedToMinimumLevel": "Information"
        }
    }

注意

对于 File 接收器

pathFormat 应该是 path

Serilog File Sink Documentation

问题似乎是直接写入 c: 而不是在配置中使用 File 这似乎不起作用,但写入不同的目录是可行的。

这是遇到此问题的任何人的最终解决方案

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
              WebHost.CreateDefaultBuilder(args)
                  .UseStartup<Startup>()
                  .UseSerilog();
}

Startup.cs

public Startup(IConfiguration configuration)
{
        var logConfiguration = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration);

        Log.Logger = logConfiguration.CreateLogger();
        Configuration = configuration;

}

appsettings.json

"Serilog": {
"WriteTo": [
  {
    "Name": "File",
    "Args": {
      "path": "C:\temp\log.txt",
      "rollingInterval": "Day"
    }
  }
]

}

这不是答案,而是观察。 我在这里观察到一个明确的问题。我有三个设置文件。

  1. appsettings.json,
  2. appsettings.Development.json,
  3. appsettings.VivekDev.json

我从launchSettings.json中选择了配置文件,因此环境是VivekDev,如下所示。

"ASPNETCORE_ENVIRONMENT": "VivekDev"

现在,当我在 appsettings.VivekDev.json 中进行以下设置而 appsettings.json 中没有任何 Serilog 设置时,那么一切正常。

  "Serilog": {
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "log.txt",
          "rollingInterval": "Day"
        }
      }
    ]
  },

但是当我有

"Serilog": {
  "WriteTo": [ "Debug" ]
},

appsettings.json 中,这以某种方式覆盖了 appsettings.VivekDev.json 中的设置。 根据我的理解,这是不正确的,appsettings.VivekDev.json 中的设置应该覆盖 appsettings.json.

这只发生在文件接收器的情况下。如果我使用其他接收器(例如控制台),那么一切都会按预期进行。那就是 appsettings.VivekDev.json 中的 serilog 设置正确地覆盖了 appsettings.json.

的 serilog 设置

这里肯定有问题。

所以现在,我已经删除了 appsettings.json 中的 serilog 设置,并保留了 [=61 中的 serilog 写入文件设置=]