我有一个带有 Blazor 前端的 ASP.NET Core 6 应用程序,并且我正在使用 Serilog 记录器。
目前我对记录器有以下配置。正如您所看到的,我有三个记录器,前两个记录器写入数据库,第三个记录器发出一条松弛消息(使用传入的 webhook)。
Log.Logger = new LoggerConfiguration()
.WriteTo.Logger(lc =>
lc.Filter.ByIncludingOnly(Matching.WithProperty("Type", "A1"))
.WriteTo.MSSqlServer(
connectionString: _connectionString,
sinkOptions: sinkOptionsAudit,
columnOptions: columnOptionsAudit))
.WriteTo.Logger(lc =>
lc.Filter.ByIncludingOnly(Matching.WithProperty("Type", "B2"))
.WriteTo.MSSqlServer(
connectionString: _connectionString,
sinkOptions: sinkOptionsSession,
columnOptions: columnOptionsSession))
.WriteTo.Conditional(e => e.Level == LogEventLevel.Error
|| e.Level == LogEventLevel.Fatal,
wt => wt.Slack(new SlackSinkOptions
{
WebHookUrl = "slackapi/messages",
PropertyOverrideList = new HashSet<OverridableProperties>()
{
OverridableProperties.CustomIcon,
OverridableProperties.CustomUserName
}
}))
.CreateLogger();
上面的代码作为扩展方法加载在
program.cs
中。
然后我用一些方法创建了一个名为
LoggerHelper
的静态类,例如让我们看一下以下内容。为了简化代码,我省略了完整的方法。
public static void EmitCriticalErrorSlack(string stackTrace)
{
Log.Error($"{stackTrace}");
}
我使用下面的命令调用此方法
LoggerHelper.EmitCriticalErrorSlack("Hello Fatal error!");
在我的
program.cs
中,我通过扩展方法加载了记录器配置。
这工作得很好,问题是我收到了重复的消息,或者在消息保存到数据库的情况下收到了行。
例如,如果我发出严重错误,它会被发送到 slack,几秒钟后另一条消息到达。
我尝试过以下方法
UseSerilogRequestLogging
,显然这个问题与net core中间件有关。我正在使用以下技术
有什么想法吗?
我最终通过将应用程序的
render-mode
更改为Server
解决了这个问题
之前
<component type="typeof(App)" render-mode="ServerPrerendered" />
之后
<component type="typeof(App)" render-mode="Server" />
主要问题不是 serilog 本身,而是 blazor 提供的生命周期方法的双重执行。这篇文章帮助我理解了一些:blazor 中的 RenderMode.Server 和 RenderMode.ServerPrerendered 有什么区别?.
我调试了代码,一些方法如
OnInitialized
a OnInitializedAsync
现在只执行一次。