【发布时间】:2018-03-08 18:08:03
【问题描述】:
我正在为 Serilog 编写一个丰富器,我想添加一个可能触发新日志事件的属性,实际上:
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
ISession session = /* HttpContext.Session */;
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("ValueFromSession", session.GetString("ValueFromSession")));
/* other properties ... */
}
我希望能够将我的 http 会话中的一个值添加到我的日志中,因此我将 LogContext.PushProperties 与自定义丰富器一起使用。每当读取过期会话时,ASP.NET Core 都会记录一个警告,这会触发我的丰富器,但是每当我尝试从丰富器中的会话中读取时,它就会警告我有关过期的会话,这会触发我的丰富器的新实例(ad infitum )。这会导致 StackOverflowException 似乎无法被 try 块捕获。
在Enrich 方法中是否有任何方法可以禁用日志记录?或者我可以以某种方式检测到这种递归(解析堆栈跟踪除外)?
【问题讨论】:
-
仔细检查有没有循环引用
-
我的代码和 ASP.NET 之间存在间接引用,如问题中所述,但我无法删除该引用,因为我需要能够从会话中读取并且我想要 ASP .NET 警告我有关过期的会话。
-
从
Enrich()中抛出的异常应该被 Serilog 捕获,并且不会导致另一个顶级异常处理程序被触发。听起来这里可能发生了其他事情;您可以在问题中添加堆栈跟踪吗?干杯! -
问题不在于它记录了抛出的异常,在这种特殊情况下,每当我访问
HttpContext.Session时,ASP.NET 只会记录一个警告,我希望能够在我的浓缩器中做到这一点.这种相互递归的最终结果是堆栈溢出。
标签: c# .net asp.net-core stack-overflow serilog