在ASP.NET Core 3.1中加快日志记录请求响应-RequestResponseLoggingMiddleware类

时间:2019-12-17 09:06:28

标签: asp.net-core .net-core asp.net-core-mvc .net-core-3.0

摘要:

我想检查是否可以加快ASP.NET Core 3.1中的请求响应日志记录。这是至关重要的部分,因为对服务器的每个请求都将在日志记录中间件中执行代码。

我特别想知道最好的(最快的)解决方案来记录所有带有一些基本信息(用户,IP,请求正文-非响应)的请求。

详细的考试安排-我的想法,尝试...

每个代码都在public async Task Invoke(HttpContext context)类的RequestResponseLoggingMiddleware方法内运行。

我特别想知道的是Invoke方法内部必须完成什么,以及我可以利用什么来处理后台线程(尚未等待的新任务-不知道这样做是否可以保存,或者queued background tasks

首先,我尝试调用await context.Response.CompleteAsync();,然后处理将请求保存到数据库的情况。
我唯一想到的就是,保存到数据库是可以优化的。

在致电CompleteAsync之后,我添加了Task.Delay(10000)。我希望该请求将完成并发送给客户端,但事实并非如此。我初始化了20个相同的请求(有些是从数据库中读取的),但同时仅发出2-4个请求,然后在10秒后又发出了2-4个请求,依此类推。
然后我得出结论,必须完成整个Invoke方法,这样才能进行下2-4个请求。
这意味着Invoke必须尽快结束,并且将值存储到一些慢速数据库不是一个好主意。 (因为CompleteAsync不会为另一个请求释放锁定。)

另一个提出的问题是我需要在Invoke方法中做什么。我很确定,但不确定,这必须在Invoke方法中执行:

  • this.ContextAccessor?.HttpContext?.User?...
  • request.HttpContext.Connection.RemoteIpAddress

但是ServiceProvider.CreateScope().GetRequiredService<LogToDatabaseService>()呢?我认为这必须在Invoke方法内完成,但是肯定要花时间,因为它需要(每次)创建范围服务,或者我应该在某个静态变量中存储来自CreateScope的结果并使用它在每个请求中(LogToDatabaseService被注册为作用域,因此应该是线程安全的。)

很多问题。基本上,我想知道什么是将所有请求记录到数据库的最佳(最快)解决方案,以及有关登录用户,请求正文(非响应)和请求IP的一些信息。

其他信息:

当前数据库位于同一台计算机上,但是这是迁移到另一台计算机的计划(日志量很大,因此无需使用SSD磁盘...)。

我正在从访问令牌登录用户(因此IIS日志是不够的)。我还将加载有关用户的其他信息。例如,当前登录的租户。

如果由于某些特殊原因(服务器停机时间)而丢失了某些请求,那不应该是问题。

0 个答案:

没有答案