Serilog重复日志

问题描述 投票:0回答:1

我有一个带有 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,几秒钟后另一条消息到达。

我尝试过以下方法

  • 确保我在应用程序设置中没有重复的记录器配置。我那里没有任何与serilog相关的配置。
  • 使用过
    UseSerilogRequestLogging
    ,显然这个问题与net core中间件有关。

我正在使用以下技术

  • NET核心6.0
  • Serilog 接收器:Serilog.Sinks.MSSqlServer v6.3.0、Serilog.Sinks.Slack v2.2.2
  • Serilog.Formatting.Compact v2.0.0
  • Serilog.AspNetCore v8.0.0 --> 该包提供了 UseSerilogRequestLogging() 的模块。

有什么想法吗?

asp.net-core logging serilog
1个回答
0
投票

我最终通过将应用程序的

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
现在只执行一次。

© www.soinside.com 2019 - 2024. All rights reserved.