如何关联给定电路的 Blazor activity 或 "session"
How to correlate Blazor activity for a given circuit or "session"
假设您有一个简单的服务器端 Blazor 应用程序,其中包含一个带有一个按钮的网页,例如:
@page "/counter"
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private async Task IncrementCount()
{
currentCount++;
}
}
每次(来宾)用户单击一个按钮时,都会有一个不同的线程处理该请求。
是否有 Blazor 电路或“会话”的单个标识符,允许与所描述的 activity 进行某种关联?
我研究了这个问题并为服务器端 Blazor 创建了一个示例:https://github.com/akovac35/Logging.Samples
主要有以下几点:
- 注册将通过 AsyncLocal 创建环境上下文的相关中间件,
- 在自定义代码或 Blazor 页面中从 AsyncLocal 获取当前关联,
- 当 Blazor 在代理后面时,以上内容也适用。
以下日志摘录显示在同一个 activity 期间,线程如何从 8 变为 10,而相关值 fe515ed1-d387-4b95-aef2-79eccc978017 保持不变。因此,如果我们在应用程序中出现错误,我们可以通过向用户请求相关值并检查日志来快速识别实际问题。
[21:40:10.495 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <WebApp.Pages.Counter:IncrementCount:25> Entering
[21:40:10.509 +01:00] INF 8 fe515ed1-d387-4b95-aef2-79eccc978017 <WebApp.Pages.Counter:IncrementCount:28> currentCount: 2
[21:40:10.595 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:FirstLevelAsync:41> Entering: 500
[21:40:10.691 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:SecondLevelAsync:51> Entering: 500
[21:40:10.776 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:ThirdLevelAsync:61> Entering: 500
[21:40:11.362 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:ThirdLevelAsync:65> Exiting: 500
[21:40:11.378 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:SecondLevelAsync:55> Exiting: 500
[21:40:11.396 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:FirstLevelAsync:45> Exiting: 500
[21:40:11.490 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <WebApp.Pages.Counter:IncrementCount:34> Exiting
假设您有一个简单的服务器端 Blazor 应用程序,其中包含一个带有一个按钮的网页,例如:
@page "/counter"
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private async Task IncrementCount()
{
currentCount++;
}
}
每次(来宾)用户单击一个按钮时,都会有一个不同的线程处理该请求。
是否有 Blazor 电路或“会话”的单个标识符,允许与所描述的 activity 进行某种关联?
我研究了这个问题并为服务器端 Blazor 创建了一个示例:https://github.com/akovac35/Logging.Samples
主要有以下几点:
- 注册将通过 AsyncLocal 创建环境上下文的相关中间件,
- 在自定义代码或 Blazor 页面中从 AsyncLocal 获取当前关联,
- 当 Blazor 在代理后面时,以上内容也适用。
以下日志摘录显示在同一个 activity 期间,线程如何从 8 变为 10,而相关值 fe515ed1-d387-4b95-aef2-79eccc978017 保持不变。因此,如果我们在应用程序中出现错误,我们可以通过向用户请求相关值并检查日志来快速识别实际问题。
[21:40:10.495 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <WebApp.Pages.Counter:IncrementCount:25> Entering
[21:40:10.509 +01:00] INF 8 fe515ed1-d387-4b95-aef2-79eccc978017 <WebApp.Pages.Counter:IncrementCount:28> currentCount: 2
[21:40:10.595 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:FirstLevelAsync:41> Entering: 500
[21:40:10.691 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:SecondLevelAsync:51> Entering: 500
[21:40:10.776 +01:00] VRB 8 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:ThirdLevelAsync:61> Entering: 500
[21:40:11.362 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:ThirdLevelAsync:65> Exiting: 500
[21:40:11.378 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:SecondLevelAsync:55> Exiting: 500
[21:40:11.396 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <Shared.Mocks.BusinessLogicMock`1:FirstLevelAsync:45> Exiting: 500
[21:40:11.490 +01:00] VRB 10 fe515ed1-d387-4b95-aef2-79eccc978017 <WebApp.Pages.Counter:IncrementCount:34> Exiting