Serilog 中 NLog 的“最终”规则的替代方案

And*_*nov 5 c# logging nlog serilog

可以像这样配置 NLog:

<rules>
 <logger name="Microsoft.EntityFrameworkCore.*" minlevel="Trace" writeTo="file-ef" final="true" />
 <logger name="Microsoft.*" minlevel="Trace" writeTo="file-http,console" final="true" />
 <logger name="*" minlevel="Trace" writeTo="file,console" />
</rules>
Run Code Online (Sandbox Code Playgroud)

final关键字的规则允许使用单独的目标的可能性:

  1. Microsoft.EntityFrameworkCore.* 记录员
  2. 其他Microsoft.*记录器
  3. 所有其他记录器

配置简单且合乎逻辑,我可以轻松添加另一个条件,而无需修改所有其他规则。

使用 Serilog 做同样的事情,我必须编写以下代码:

const string format = "[{Timestamp:HH:mm:ss.fff} {ThreadId} {Level:u3}] {Message:lj} [{SourceContext}] {NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Verbose()
            .Enrich.FromLogContext()
            .Enrich.WithThreadId()
            .WriteTo.Console(outputTemplate: format)
            .WriteTo.Logger(cfg => cfg
                .Filter.ByIncludingOnly(Matching.FromSource("Microsoft.AspNetCore"))
                .WriteTo.RollingFile(@"logs\{Date}.http.log", outputTemplate: format, retainedFileCountLimit: null, buffered: true))
            .WriteTo.Logger(cfg => cfg
                .Filter.ByIncludingOnly(Matching.FromSource("Microsoft.EntityFrameworkCore"))
                .WriteTo.RollingFile(@"logs\{Date}.ef.log", outputTemplate: format, retainedFileCountLimit: null, buffered: true))
            .WriteTo.Logger(cfg => cfg.Filter
                .ByExcluding(Matching.FromSource("Microsoft"))
                .WriteTo.RollingFile(@"logs\{Date}.log", outputTemplate: format, retainedFileCountLimit: null, buffered: true))
            .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

要添加另一个条件,我必须将其从所有其他过滤器中排除。

问题:我是否遗漏了什么,或者如果匹配其他规则,没有简单的方法可以跳过其他规则?

Nic*_*rdt 1

这并不是 Serilog 的 API 特别强大的场景,但Serilog.Sinks.Map涵盖了这种情况。

    // Install-Package Serilog.Sinks.Map -Pre

    var isAsp = Matching.FromSource("Microsoft.AspNetCore");
    var isEF = Matching.FromSource("Microsoft.EntityFrameworkCore");
    var isMS = Matching.FromSource("Microsoft");

    Log.Logger = new LoggerConfiguration()
        .WriteTo.Map(le => isAsp(le) ? ".http" :
                            isEF(le) ? ".ef" :
                            !isMS(le) ? ".other" :
                            "",
            (slug, wt) => wt.RollingFile($"logs\\{{Date}}{slug}.log"))
        .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

  • 是的,我在搜索或解决方案时遇到过这个项目,但是定义在哪里写入哪种类型的日志的规则仍然不是那么容易。而且,我无法为每个过滤器指定多个接收器。接受答案,因为确实涵盖了“最终”案例。 (2认同)