Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core Serilog-无法基于属性登录到多个文件_Asp.net Core_Logging_Serilog_Rollingfilesink - Fatal编程技术网

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();