如何配置 App.config 以删除 Serilog.Sinks.MSSqlServer 标准列?

How to configure App.config to remove Serilog.Sinks.MSSqlServer standard columns?

我使用 Serilog 进行日志记录。我需要配置 App.config 以从 Logs table 中删除 2 个标准列(StandardColumn.PropertiesStandardColumn.MessageTemplate)。我在 Serilog 文档和其他资源中搜索过它,但找不到如何操作。这是我到目前为止得到的:

<configuration>
    <appSettings>
        <add key="serilog:using:MSSqlServer" value="Serilog.Sinks.MSSqlServer" />
        <add key="serilog:write-to:MSSqlServer.connectionString" value="Data Source=SomeServer;initial catalog=DB; integrated security=True" />
        <add key="serilog:write-to:MSSqlServer.tableName" value="Logs" />
        <add key="serilog:minimum-level" value="Debug" />
    </appSettings>
</configuration>

我想我必须添加这一行:

<add key="serilog:write-to:MSSqlServer.columnOptions" value="someColOptions" />

但是我应该如何定义someColOptions?例如,我使用这种代码删除了列:

var colOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
colOptions.Store.Remove(StandardColumn.Properties);
colOptions.Store.Remove(StandardColumn.MessageTemplate);

Log.Logger = new LoggerConfiguration()
    .WriteTo
    .MSSqlServer(
        connectionString: conn_string,
        sinkOptions: new MSSqlServerSinkOptions { TableName = "Logs" },
        columnOptions: colOptions)
    .MinimumLevel.Debug()
    .CreateLogger();

现在我想在 App.config

中做同样的事情

我有一个类似的问题,我已经能够通过添加以下内容发现 configSections 必须是之后的第一部分 这将:

  1. 在指定的数据库中创建日志table(来自连接字符串)
  2. 使用 Serilog 数据库帐户(来自连接字符串)
  3. 从日志中删除名为属性的列table
  4. 添加一个名为 RunId 的新列,声明为 int
<configuration>
    <configSections>
        <section name="MSSqlServerSettingsSection" type="Serilog.Configuration.MSSqlServerConfigurationSection, Serilog.Sinks.MSSqlServer"/>
    </configSections>
    <MSSqlServerSettingsSection DisableTriggers="false" ClusteredColumnstoreIndex="false" PrimaryKeyColumnName="Id">
        <!-- SinkOptions parameters -->
        <TableName Value="Logs"/>
        <BatchPeriod Value="00:00:15"/>
        <RemoveStandardColumns>
            <remove Name="Properties"/>
        </RemoveStandardColumns>        
        <Columns>
            <add ColumnName="RunId" DataType="int"/>
        </Columns>
    </MSSqlServerSettingsSection>
    <appSettings>
        <!-- Serilog Settings -->
        <add key="serilog:minimum-level" value="Verbose" />
        <add key="serilog:using:Console" value="Serilog.Sinks.Console"/>
        <add key="serilog:write-to:Console"/>
        <add key="serilog:using:File" value="Serilog.Sinks.File" />
        <add key="serilog:write-to:File"/>
        <add key="serilog:write-to:File.path" value="{PATH}" />
        <add key="serilog:write-to:File.rollingInterval" value="Day"/>
        <add key="serilog:using:MSSqlServer" value="Serilog.Sinks.MSSqlServer" />
        <add key="serilog:write-to:MSSqlServer.connectionString" value="Server=[SERVER];Database=[DATABASE];User Id=Serilog;Password=[PASSWORD];"/>
        <add key="serilog:write-to:MSSqlServer.tableName" value="Logs"/>
        <add key="serilog:write-to:MSSqlServer.autoCreateSqlTable" value="true"/>
    </appSettings>
</configuration>

调用日志。("{RunId}{Message}", _runId, _messageToShow) 导致我的文件、控制台和 MSSqlServer 接收器执行写入这些,如果它不存在,日志 table 将被创建,删除 Properties 列并添加 RunId 列。 (如果 table 存在,它除了写入数据之外什么都不做,仍在尝试找出如何处理它)。

我还在研究这个(我接下来的事情是弄清楚如何写{RunId}但不让它出现在日志中,只写入相应的数据库字段)。

HTH,

菲尔