在 ASP.Net Core 中全局设置日志记录范围

2024-01-03

我想要获取 ASP.Net Core 服务中每条日志消息中记录的某些关键信息(服务名称、服务版本、主机名等)。

我有以下代码:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (host.Services.GetRequiredService<ILogger<Program>>().BeginScope("ServiceName: {0}", "bob-service"))
        {
            host.Run();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(builder =>
            {
                builder.AddConsole(o => o.IncludeScopes = true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

由此我得到以下日志记录:

info: Microsoft.Hosting.Lifetime[0]
      => ServiceName: bob-service
      Now listening on: http://localhost:5002

info: Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker[102]
      => ConnectionId:0HLSO8706NGBN => RequestPath:/ RequestId:0HLSO8706NGBN:00000001, SpanId:|aa5794ba-408ad22a63064421., TraceId:aa5794ba-408ad22a63064421, ParentId: => Middleware_Scope => /Index
      Executed handler method OnGet, returned result .

请注意如何ServiceName仅出现在主机级日志记录中。请求级别的日志记录确实not包括它。

是否有一种机制可以设置范围every来自 ASP.Net Core 的日志消息。

我尝试添加一个中间件来执行此操作,它基本上可以工作,但日志记录不会出现在"Microsoft.AspNetCore.Hosting.Diagnostics"日志消息(尽管据我所知它出现在其他所有内容上)。

app
    .Use(async (context, next) =>
    {
        // Middleware to add scoped values to log messages.
        var logger = context.RequestServices.GetRequiredService<ILogger<Startup>>();
        using (logger.BeginScope("ServiceName: {0}", "bob-service")))
        {
            await next();
        }
    });

EDIT

即使使用上述中间件,也会记录来自Microsoft.AspNetCore.Hosting.Diagnostics记录器不包含作用域字段。例如,请注意在第二条日志消息中,Middleware_Scope不出现范围消息。

info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[6]
      => ConnectionId:0HLSOTDVELPJA => RequestPath:/css/site.css RequestId:0HLSOTDVELPJA:00000001, SpanId:|2fbd556d-44cc7c919266ccaf., TraceId:2fbd556d-44cc7c919266ccaf, ParentId: => Middleware_Scope
      The file /css/site.css was not modified

info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      => ConnectionId:0HLSOTDVELPJD => RequestPath:/js/site.js RequestId:0HLSOTDVELPJD:00000001, SpanId:|2fbd5570-44cc7c919266ccaf., TraceId:2fbd5570-44cc7c919266ccaf, ParentId:
      Request finished in 29.8413ms 304 application/javascript

我不知道这是否正确,但我开始使用全局设置范围ILoggerProvider代替ILogger<T>,并为其设置我自己的范围提供程序,如下所示:

    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        
        // ... other logging configurations, like ClearProviders() and AddJsonConsole(o => o.IncludeScopes = true);

        var provider = host.Services.GetService<ILoggerProvider>()
        if (provider is ISupportExternalScope scopedProvider)
        {
            var scopes = new LoggerExternalScopeProvider();
            scopes.Push("ServiceName: bob-service");
            scopedProvider.SetScopeProvider(scopes);
        }

        host.Run();
    }

你可能需要使用GetServices<ILoggerProvider>如果您有多个提供者,请保存一份清单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.Net Core 中全局设置日志记录范围 的相关文章

随机推荐

  • 将 CSV 列保存到数组?

    我想将 CSV 文件中的三列保存到三个不同的数组中 一列用于用户名 一列用于 IP 地址 一列用于密码 但它似乎不起作用 至少从我的理解来看 这是代码 Importedcsv Import csv C my file is located
  • Actionscript 3:您需要删除事件监听器吗?

    在 ActionScript 3 中 我动态创建对象并添加事件监听器 这些对象被添加到数组中 稍后可能会再次删除 其他的可能稍后会再次添加 每次创建对象时 我都会将这些 EventListener 添加到其中 但是 在删除这些对象时是否也需
  • 从 AsyncTaskLoader 更新 UI

    我已经转换了我的AsyncTask to an AsyncTaskLoader 主要是为了处理配置更改 我有一个TextView我正在使用进度状态并且正在使用onProgressUpdate in the AsyncTask来更新它 看起来
  • EmberJS 嵌套视图和控制器

    我正在使用 EmberJS v1 0 pre 编写一个应用程序 我有一个ArrayController其中包含所有人的列表 有一堆嵌套视图显示人 他们的宠物以及每只宠物的注释 John lt Person Quincy Dog lt Pet
  • django unittest:即使我发送令牌,client.get 错误 401

    我尝试为方法注销创建一个单元测试 我有这个目的 response client get api v1 logout self assertEquals response status code 200 但在我的注销控制器中我有这个 perm
  • 长数字的 JSON 解组给出浮点数

    例如 我使用 golang 编组和解组 JSON 当我想使用数字字段时 golang 将其转换为浮点数 而不是使用长数字 我有以下 JSON id 12423434 Name Fernando After marshal它到地图上并且unm
  • Django 中随机发生运行时错误死锁

    在 Python 3 7 9 中运行 Django 我正在使用通道 因此使用 daphne 但即使我使用 Gunicorn 也会获得相同的结果 下面的错误是随机出现的 ERROR 2021 07 12 11 55 07 478 HTTP G
  • Fortran - lbound 抛出错误 6366“数组表达式的形状不符合”

    所以我又被Fortran弄糊涂了 去搞清楚 不管怎样 我正在尝试编写一个非常简单的例程 将值从数组末尾剥离 一切复杂的工作都很好 除了我想编写子例程 这样我就不必将输入数组的下限传递给它 这是子程序 subroutine Strip lis
  • Linux内核:从内核空间调用用户空间的回调函数

    我正在编写 Linux 用户空间应用程序 我想从内核空间调用用户空间区域中注册的回调函数 即中断到达 GPIO 引脚 开关按下事件 并在用户空间中调用注册函数 有没有什么方法可以做到这一点 Thanks 经过大量挖掘后 我发现了下面的代码
  • 将 HTML 转换为 Word DOC,其中我有输入字段

    从 HTML 转换为 DOC 的问题在于输入字段 是否可以仅从输入字段中提取 DOC 值 而不是直接从浏览器中提取整个元素 HTML 示例 div class source html outer div h1 h1 div div
  • 如何处理bigquery中的动态模式

    我的数据如下所示 第 1 行 id 1 object user metadata name 1234 第 2 行 id 1 object user metadata name 1234 email email protected cdn c
  • 从方案列表中删除所有重复成员

    我正在尝试使用递归删除列表中的重复项 这就是我所拥有的 它仅删除第一个重复项 而不是全部 我的想法是查看第一个成员 检查它是否是列表其余部分的成员 如果是 则再次调用该函数 如果没有 则创建一个包含第一个成员和再次调用该函数的结果的列表 我
  • 如何在单个图表中可视化多态调用?

    首先 看一下这些Java代码 Drawable java package examples simple model public interface Drawable public void draw 形状 java package ex
  • 如何找到jqgrid中的最后一行

    目前我正在研究 jqgrid 我必须找出最后一行并实现 ctrl down 功能 但目前我无法获得最后一排 这里需要有人帮助 提前致谢 如果网格 id 是例如list那么下面的表达式应该返回最后一行 list find gt tbody g
  • 如何使用 clojure 作为 Java 程序的脚本语言?

    对于用 Java 编写的服务器程序 我需要为 待指定的 查询语言添加解释器 用户应该能够将自己编写的查询 程序 发送到该服务器 并接收返回的结果 基本上只是一个字符串列表 查询的语言尚未指定 所以我想在这里使用 clojure 作为脚本语言
  • Google 图表 - 避免在 yAxis 中显示负值

    我有以下代码 function drawVisualization Create and populate the data table var data google visualization arrayToDataTable Year
  • 如何使用python解析ld+json

    我一直在尝试一些网络抓取 并且发现了位于此标签内的一些有趣的数据
  • Swift 中如何判断泛型是否是可选的?

    我想用一个函数扩展一个数组 该函数将返回数组中所有非零项的计数 理想情况下 这适用于任何可选或非可选类型的数组 我尝试了各种方法 但都无法编译 使 Xcode 崩溃或两者兼而有之 我本以为它会是这样的 extension Array fun
  • `const T` 和 `T` 在获取其嵌套类型时没有区别吗?

    include
  • 在 ASP.Net Core 中全局设置日志记录范围

    我想要获取 ASP Net Core 服务中每条日志消息中记录的某些关键信息 服务名称 服务版本 主机名等 我有以下代码 public class Program public static void Main string args va