Serilog多个水槽不工作

时间:2015-03-10 16:17:09

标签: asp.net-mvc logging asp.net-web-api serilog

我正在使用serilog将所有Web API跟踪事件记录到一个文件中,并通过以下代码将所有代码调试到另一个文件:

问题是trace.json也记录了Debug事件,我怀疑是因为minimumLevel过滤器。

如何将事件分成两个文件?

尝试this问题,但它根本不写文件。

使用最新的serilog版本。

Log.Logger = new LoggerConfiguration()
.WriteTo.Trace(outputTemplate: "{Timestamp} [{Level}] ({HttpRequestId}|{UserName}) {Message}{NewLine}{Exception}")
.MinimumLevel.Debug()
.WriteTo.Sink(new FileSink(@"E:\log.json", new JsonFormatter(false, null, true), null), LogEventLevel.Debug)
.MinimumLevel.Verbose()
.WriteTo.Sink(new FileSink(@"E:\trace.json", new JsonFormatter(false, null, true), null), LogEventLevel.Verbose)
.Enrich.With<HttpRequestIdEnricher>()
.Enrich.With<UserNameEnricher>()
.Enrich.WithProperty("App", "CarbonFactoryERP")
.CreateLogger();

以下是我如何调用记录器:

Log.Logger.Debug("Web API Register Method started at {TimeStamp}",DateTime.UtcNow);

Log.Logger.Verbose("{TimeStamp} {Operation} {Operator} {Message} {Category}", rec.Timestamp, rec.Operation, rec.Operator, rec.Message, rec.Category);

2 个答案:

答案 0 :(得分:1)

这是Serilog接收器的预期行为。最低级别参数仅指定您所期望的最小值 - 不是精确的级别匹配。

要解决此问题并将特定级别写入接收器,您可以创建一个单独的日志管道并应用限制并使用:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Logger(config => config
        .Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug)
        .WriteTo.Sink(new FileSink(@"E:\trace.json", ...))
    // Write to other sinks here

(可能需要一些错字修正,从内存开始工作。)

答案 1 :(得分:0)

此示例将根据日志级别和SourceContext(应用程序命名空间,类名等)登录到同一个接收器(但可以写入不同的接收器)。它具有针对所有MyAppRootNamespace类的详细最小日志级别以及针对其他源上下文(Microsoft。*等)的警告最小日志级别。这将为您提供满足您确切需求的起点。

Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Verbose()
                .Enrich.FromLogContext()
                .WriteTo.Logger(lc => lc
                    .Filter.ByIncludingOnly(Matching.FromSource("MyAppRootNamespace"))
                    .WriteTo.Seq("http://localhost:1009"))
                .WriteTo.Logger(lc => lc
                    .Filter.ByIncludingOnly(e => e.Level >= LogEventLevel.Warning)
                    .Filter.ByExcluding(Matching.FromSource("MyAppRootNamespace"))
                    .WriteTo.Seq("http://localhost:1009"))
                .CreateLogger();

要使源上下文(MyAppRootNamespace)起作用,您需要为要记录的每个类添加一个vble。

public class MyClass
{
    private ILogger _log = Log.ForContext<MyClass>();
}