摘要:
我想检查是否可以加快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日志是不够的)。我还将加载有关用户的其他信息。例如,当前登录的租户。
如果由于某些特殊原因(服务器停机时间)而丢失了某些请求,那不应该是问题。