如何在c#中对所有日志进行分组

How to group all the logs in c#

我有一个主要的 mvc 应用程序,它将调用 3 个 Web api 应用程序,并将使用 log.LogInformation() 为 mvc 项目中的每个方法命中和每个控制器写入日志。我创建了一个名为 username 的变量,并让每个日志在消息末尾包含该用户名。 IE。 log.LogInformation("You have hit the home page of the mvc project... {@Username}, username)所以在每条日志消息的末尾我都使用 {@Username} 并传递 username。我想根据该变量 username 对所有整个日志进行分组。有没有办法将所有记录到记录器的整个日志分组,从 mvc 项目开始到调用的每个 web api 项目?我正在使用 Serilog 来写日志。


跟进:

所以在阅读 Log scopes 并使用 BeginScope 之后,我可以在我最后一个控制器的 mvc 项目中创建另一个方法:

    public IActionResult GetAllLogs()
    {
        using (_logger.BeginScope("Gathering all the logs created for {@Username}", HomeController.username))
        {

        }
    }

所以保留它就可以从包含 Web api 项目日志的 mvc 项目中收集所有日志?我不需要在 using() 语句中做任何事情?

您可以检查日志范围 (Read here)。使用 BeginScope,范围内的所有日志语句都将 属性 记录为自定义 属性.

例如:Scope 开始于 SomeAPI API,它调用 Method1 -> Method2 -> Method3DoesTheLogging。现在直到方法 Method3DoesTheLogging,不需要传递 属性 来记录日志语句。日志框架将自动附加在 BeginScope.

中定义的自定义 属性
    public IActionResult SomeAPI()
    {
        using (_logger.BeginScope("Gathering all the logs created for {@Username}", HomeController.username))
        {
            Method1();
        }
    }
    
    public void Method1()
    {
        Method2();
    }
    
    public void Method2()
    {
        Method3DoesTheLogging();
    }
    
    public void Method3DoesTheLogging()
    {
        _logger.LogInformation("This log statement will log the username automatically as custom property".);
    }

因此使用 Log 范围,您不需要将 属性 传递到第 n 个函数级别。因为,属性 被记录为自定义 属性,所以您可以进行分组、过滤 e.t.c、