我正在使用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);
答案 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>();
}