Serilog 命名连接字符串

Mar*_*ner 6 serilog .net-core

我正在尝试在 .Net core 上配置 Serilog 以使用命名连接字符串写入 SQL 表。如果我将连接字符串直接放在 appsettings 文件的“Serilog”部分中,我就可以让一切正常工作。但我希望它使用与实体框架相同的连接字符串,所以我不想定义它两次。另外,出于安全原因,建议似乎不要将此信息直接存储在 appsettings 文件中。

这是设置文件的相关部分:

{
    "Name": "MSSqlServer",
    "Args": {
        "connectionString": "Development",
        "schemaName": "app",
        "tableName": "Logs",
        "restrictedToMinimumLevel": "Information"
    }
}
Run Code Online (Sandbox Code Playgroud)

开发连接字符串是在 Visual Studio 中的“用户机密”中定义的。

{
    "ConnectionStrings": {
        "Development": "Server=...",
        "Staging": "Server=...",
        "Production": "Server=..."
    }
}
Run Code Online (Sandbox Code Playgroud)

正如我所提到的,如果我用实际的字符串替换“Development”,它就可以工作。我还应该补充一点,实体框架正在使用开发连接字符串,因此我非常确定该字符串本身是好的。

我以这种方式在 Startup.Configure 方法中加载配置

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(_configuration)
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

奇怪的是,如果我在同一方法中手动添加 MSSqlServer 对象,它将起作用(在删除 appsetting 文件的 MSSqlServer 部分之后)。显然这并不理想,因为更改任何属性都需要重新编译应用程序

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(_configuration)
    .WriteTo.MSSqlServer(
        connectionString: _configuration.GetConnectionString(env.EnvironmentName),
        schemaName: "app",
        tableName: "Logs",
        restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information
    )
   .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

我在 GitHub 上找到了这个线程,它告诉我这可能是一个已知问题。不幸的是,如果这是真的,那么这方面的活动似乎很少。

我使用的是Serilog.AspNetCore2.1.1版本、Serilog.Settings.Configuration3.0.1版本、Serilog.Sinks.MSSqlServer5.1.2版本和.Net core2.1版本。

任何帮助将不胜感激。

Dan*_*n Z 3

我也遇到了同样的问题。安装最新的开发包为我解决了这个问题:

Install-Package Serilog.Settings.Configuration -version 3.0.2-dev-00187 
Install-Package Serilog.Sinks.MSSqlServer -version 5.1.3-dev-00232
Run Code Online (Sandbox Code Playgroud)