Asp.net core Serilog-无法基于属性登录到多个文件
您好,我正在尝试使用Asp.net core Serilog-无法基于属性登录到多个文件,asp.net-core,logging,serilog,rollingfilesink,Asp.net Core,Logging,Serilog,Rollingfilesink,您好,我正在尝试使用Serilog将一些消息记录到一个文件中,另一些消息记录到另一个文件中 我尝试了以下配置: Log.Logger = new LoggerConfiguration() .WriteTo.Map("type", "audit", (name, x) => x.File(auditLogPath)) .WriteTo.Map("type&quo
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();
现在,我希望当我将键为audit
的键值对推送到日志上下文时,我的数据会以第一种模式audit
记录:
using(LogContext.PushProperty("type","audit")
{
Log.Information("something");
}
为什么我的数据是第二种模式?它被记录到控制台并放入另一个文件中,我不明白为什么
更新
从下面的答案中,我了解到不需要定义多个记录器,而是根据键进行调度:
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
+控制台
)
您误解了Map
的第二个参数是什么。这不是一个过滤器。。。它只是keyPropertyName
的默认值,以防日志事件中不存在它
根据类型
属性的值选择接收器的决定必须由您在映射
配置的主体中完成
e、 g
还请注意,如果不通过LogContext
启用扩展功能,您正在推送的属性将对Map
不可见,因此您需要上面的.rich.FromLogContext()
。那么您是说我不需要使用Map
两次?基本上,当我有多个需要匹配的键时,我应该使用多个映射
。@Bercovicadrian更正了,因此我使用了您提供的配置,但不知怎的,委托中的类型
从未得到审核
,即使我使用LogContext.PushProperty(“类型”、“审核”)
写入记录器时。它们都会被放入日志路径
。您忘记添加。rich.FromLogContext()
。。。读我答案中的最后一句话
using(LogContext.PushProperty("type","audit"))
{
Log.Information("something");
}
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();