在.NET 7 API中使用不同的日志记录器或日志记录配置

bwntbbo3  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(191)

我有一个使用.NET 7 API的React应用程序。我们使用Graylog进行日志记录。我们的想法是为react应用程序提供一个API端点来发布其错误日志。如果错误来自Web应用程序,我想使用不同的日志源。为了做到这一点,我编写了一个基于请求路由的中间件类。如果/logs路由被命中,我向Logger工厂添加了一个新的Logger配置。
中间件类:

using Gelf.Extensions.Logging;

namespace MyProject1.Api.Extensions
{
    public class LoggingMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly IConfiguration _configuration;
        private readonly ILoggerFactory _loggerFactory;

        public LoggingMiddleware(
            RequestDelegate next,
            IConfiguration configuration,
            ILoggerFactory loggerFactory)
        {
            _next = next;
            _configuration = configuration;
            _loggerFactory = loggerFactory;
        }

        public async Task Invoke(HttpContext context)
        {
            if (context.Request.Path.StartsWithSegments("/logs"))
            {
                var gelfOptions = new GelfLoggerOptions();
                _configuration.GetSection("Logging:WebAppGELF").Bind(gelfOptions);
                gelfOptions.AdditionalFields["machine_name"] = Environment.MachineName;

                _loggerFactory.AddGelf(gelfOptions);

                await _next(context);
            }
            else
            {
                await _next(context);
            }
        }
    }
}

字符串
下面是appsettings.json中的日志部分:

"Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    },
    "GELF": {
      "Host": "xxx.graylog.com",
      "LogSource": "API"
    },
    "WebAppGELF": {
      "Host": "xxx.graylog.com",
      "LogSource": "WebApp"
    }
  }


program.cs中的配置:

app.UseMiddleware<LoggingMiddleware>();

using (var serviceScope = app.Services.CreateScope())
{
    var services = serviceScope.ServiceProvider;
    var logger = services.GetRequiredService<MyProject1.Logging.IMyLogger<MyProject1.Api.Extensions.Project1Exception>>();
    app.ConfigureExceptionHandler(logger);
}


通过上面的例子,每次/logs端点被命中时,都会写入两个日志条目。内容是相同的,但是一个日志条目包含LogSource : API,另一个包含LogSource : WebApp。我假设发生这种情况是因为logger工厂包含两个logger,并且两者都被调用。
基本上,我想根据控制器或使用日志记录器的类使用不同的日志记录器或日志记录配置。

enxuqcxy

enxuqcxy1#

我可以通过在控制器的构造函数中创建一个新的logger工厂来创建一个新的logger。这个控制器将被Web应用程序调用,因此控制器特定的配置将完成这项工作。

public class LogsController : Controller
{
    private readonly ILogger _logger;
    private readonly IConfiguration _configuration;

    public LogsController(IConfiguration configuration)
    {
        _configuration = configuration;

        _logger = LoggerFactory
             .Create(configure => configure.AddGelf(m =>
             {
                 m.Host = "graylog.xxxxx.com";
                 m.LogSource = _configuration["LoggingWebApp:GELF:LogSource"] ?? "webapp_local";
                 m.AdditionalFields["Project"] = "my_project";
                 m.AdditionalFields["Environment"] = _configuration["Logging:GELF:AdditionalFields:Environment"];
                 m.AdditionalFields["Module"] = "webapp";
             }))
             .CreateLogger("webapp");
    }

    [HttpPost("error")]
    public void Error([FromBody] WebAppLogErrorRequest model)
    {
        var userId = User.FindFirst("sub")?.Value;
        _logger.LogError(
            "Message: {message}\n"
            + "File Name: {FileName}\n"
            + "Function Name: {FunctionName}\n"
            + "Stack Trace: {StackTrace}\n"
            + "User Id: {UserId}",
            model.Message, model.FileName, model.FunctionName, model.StackTrace, userId ?? "");
    }
}

字符串

相关问题