读取Serilog的AppConfig文件

5

我有一个Logger.cs类,在其中初始化Serilog设置如下:

_logger = new LoggerConfiguration()
                .ReadFrom.AppSettings()
                .MinimumLevel.Debug()
                .WriteTo.File(_filepath, restrictedToMinimumLevel: LogEventLevel.Debug, shared: true, rollOnFileSizeLimit: true)
                .CreateLogger();

我想从 app.config 文件中读取文件大小。以下是我的 app.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="serilog:using:File" value="Serilog.Sinks.File" />
    <add key="serilog:write-to:File.fileSizeLimitBytes" value="2000" />
  </appSettings>
</configuration>

但似乎appsettings根本没有被读取。因为我可以看到生成了超过2kb的文件。我错过了什么?

我的记录器类将如何从app.config文件中读取,我在assemblyinfo类中错过了任何设置吗?

2个回答

6
通过 App.config 进行的 Serilog 配置不会与您通过 C# 代码定义的配置 "合并" ... 它们是可添加的。这意味着,在您的示例中,您正在配置两个独立的 sinks,它们都写入文件。
但是,因为您没有在 App.config 中指定 sink 的文件路径,所以它忽略了该 sink,没有对其进行配置,只有第二个 sink 被配置(在 C# 代码中)。
如果您想使用 App.config 配置,则您的 XML 应包括一个文件路径,除了 fileSizeLimitBytes 外:
<configuration>
  <appSettings>
    <add key="serilog:minimum-level" value="Debug"/>
    <add key="serilog:using:File" value="Serilog.Sinks.File" />
    <add key="serilog:write-to:File.path" value="log.txt" />
    <add key="serilog:write-to:File.rollOnFileSizeLimit" value="true" />
    <add key="serilog:write-to:File.fileSizeLimitBytes" value="2000" />
  </appSettings>
</configuration>

而你的C#代码只需从App.config中读取设置,不需要“额外”的sink。

_logger = new LoggerConfiguration()
    .ReadFrom.AppSettings()
    .CreateLogger();

注意,我还通过 App.config 配置了 MinimumLevel。这并不是必须的,但如果您已经在通过 App.config 配置 Serilog sinks,则通常是有意义的。


1
正如您所提到的,我已经从C#代码中删除了writeto.file,并将其添加到了app config中。但仍然无法正常工作。 - Rem San
有没有其他办法可以从XML文件中读取文件大小并通过LoggerConfiguration()进行配置? - Rem San
@RemSan,你在配置文件中启用了 rollOnFileSizeLimit 吗? - C. Augusto Proiete
@RemSan 如果你想要将同一个 sink 实例配置的不同参数分别存储在 C# 代码和 App.config 中,那么你不能使用 Serilog.Settings.AppSettings。你需要创建自己的 appSettings 值,在代码中通过 ConfigurationManager 读取并设置它们。 - C. Augusto Proiete
嗨@C.AugustoProiete - 我只使用AppSettings配置,并根据上述方式(以及他们的维基)在代码中启用它们,但没有成功。它根本不读取它们。我需要在appsettings配置中使用using:sink吗? - Ak777
@Ak777 很难在没有看到你的代码和/或配置的情况下做出判断。我建议你在这里提一个新问题,详细说明你的情况。 - C. Augusto Proiete

2

您可以混合使用XML和基于代码的配置,但是每个接收器必须使用XML或在代码中进行配置-添加到代码中的接收器无法通过应用程序设置进行修改。

因此,如果您需要使用App.config文件,则需要将所有配置移动到它下面,如下所示:

最初的回答:

可以混合使用XML和代码配置,但每个接收器必须使用其中之一。不能通过应用程序设置修改代码中添加的接收器。如果需要使用App.config文件,则需要将所有配置移动到该文件中。

<appSettings>
  <add key="serilog:minimum-level" value="Debug"/>
  <add key="serilog:using:File" value="Serilog.Sinks.File" />
  <add key="serilog:write-to:File.path" value="logs\log.txt" />
  <add key="serilog:write-to:File.shared" value="true" />
  <add key="serilog:write-to:File.rollOnFileSizeLimit" value="true" />
  <add key="serilog:write-to:File.fileSizeLimitBytes" value="2000" />
</appSettings>

最初的回答是使用以下代码创建日志记录器实例:

并且使用以下代码创建日志记录器实例

_logger = new LoggerConfiguration()
    .ReadFrom.AppSettings()
    .CreateLogger();

就像前面的一条评论一样,在这里补充一下,@ElasticCode,通过上述操作,代码无法识别配置并且不会将日志添加到文件或控制台(我正在配置文件和控制台作为输出) 。我甚至使用了"using"语句进行了尝试,但是效果都没有,我无法看到日志被添加到相应的输出中。 - Ak777
@Ak777 请分享您的 appSettings 配置。 - ElasticCode
<add key="serilog:minimum-level" value="Debug"/> <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.pathFormat" value="C:\Logs\App-Log-{Date}.log" /> <add key="serilog:write-to:File.rollingInterval" value="Day"/> <add key="serilog:write-to:File.outputTemplate" value="[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"/> - Ak777
在 DI 中注册记录器Log.Logger = new LoggerConfiguration() .ReadFrom.AppSettings() .CreateLogger(); container.Register(() => Log.Logger, Lifestyle.Singleton); - Ak777
@Ak777 在使用 RollingFile 日志记录器时,需要使用 path 参数而不是 pathFormat 参数。 <add key="serilog:write-to:File.path" value="C:\Logs\App-Log-.log" /> - ElasticCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接