Serilog - 无法根据 属性 记录到多个文件
Serilog - can not log to multiple files based on property
您好,我正在尝试使用 Serilog
.
在一个文件中记录一些消息,在另一个文件中记录其他消息
我试过以下配置:
Log.Logger = new LoggerConfiguration()
.WriteTo.Map("type", "audit", (name, x) => x.File(auditLogPath))
.WriteTo.Map("type", "normal", (nm, wt) => wt.File(logpath).WriteTo.Console())
.CreateLogger();
现在我期望当我 Push
一个键为 audit
的键值对到日志上下文时,我的数据将记录在第一个模式中 audit
:
using(LogContext.PushProperty("type","audit")
{
Log.Information("something");
}
为什么我的数据会进入第二种模式?它被记录到控制台并放入另一个文件,我不明白为什么。
更新
从下面的回答中我了解到不需要定义多个记录器,而是基于 key
:
进行调度
Log.Logger = new LoggerConfiguration()
.WriteTo.Map("type", string.Empty, (nm, wt) => {
if (nm == "audit") {
wt.File(auditLogPath); //i want to write here !
return;
}
wt.File(logpath).WriteTo.Console()
})
.CreateLogger();
然而,当我尝试使用它登录第一个场景 audit
时,如下所示,所有日志都放置在另一个场景中 (logpath
+ Console
)
using(LogContext.PushProperty("type","audit"))
{
Log.Information("something");
}
你误解了Map
的第二个参数是什么。它不是过滤器...它只是您 keyPropertyName
的默认值,以防它不存在于日志事件中。
根据 type
属性 的值 select 接收器的决定必须由您在 Map
配置的主体中完成。
例如
Log.Logger = new LoggerConfiguration()
.WriteTo.Map("type", string.Empty, (type, wt) =>
{
if (type.Equals("audit"))
{
wt.File(auditLogPath);
}
else if (type.Equals("normal"))
{
wt.File(logPath)
.WriteTo.Console();
}
})
.Enrich.FromLogContext()
.CreateLogger();
另请注意,如果不通过 LogContext
启用丰富,您推送的属性将对 Map
不可见,因此您需要上面的 .Enrich.FromLogContext()
。
您好,我正在尝试使用 Serilog
.
我试过以下配置:
Log.Logger = new LoggerConfiguration()
.WriteTo.Map("type", "audit", (name, x) => x.File(auditLogPath))
.WriteTo.Map("type", "normal", (nm, wt) => wt.File(logpath).WriteTo.Console())
.CreateLogger();
现在我期望当我 Push
一个键为 audit
的键值对到日志上下文时,我的数据将记录在第一个模式中 audit
:
using(LogContext.PushProperty("type","audit")
{
Log.Information("something");
}
为什么我的数据会进入第二种模式?它被记录到控制台并放入另一个文件,我不明白为什么。
更新
从下面的回答中我了解到不需要定义多个记录器,而是基于 key
:
Log.Logger = new LoggerConfiguration()
.WriteTo.Map("type", string.Empty, (nm, wt) => {
if (nm == "audit") {
wt.File(auditLogPath); //i want to write here !
return;
}
wt.File(logpath).WriteTo.Console()
})
.CreateLogger();
然而,当我尝试使用它登录第一个场景 audit
时,如下所示,所有日志都放置在另一个场景中 (logpath
+ Console
)
using(LogContext.PushProperty("type","audit"))
{
Log.Information("something");
}
你误解了Map
的第二个参数是什么。它不是过滤器...它只是您 keyPropertyName
的默认值,以防它不存在于日志事件中。
根据 type
属性 的值 select 接收器的决定必须由您在 Map
配置的主体中完成。
例如
Log.Logger = new LoggerConfiguration()
.WriteTo.Map("type", string.Empty, (type, wt) =>
{
if (type.Equals("audit"))
{
wt.File(auditLogPath);
}
else if (type.Equals("normal"))
{
wt.File(logPath)
.WriteTo.Console();
}
})
.Enrich.FromLogContext()
.CreateLogger();
另请注意,如果不通过 LogContext
启用丰富,您推送的属性将对 Map
不可见,因此您需要上面的 .Enrich.FromLogContext()
。