如何在 serilog 中覆盖泛型类型的日志级别

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

我有 ASP.NET WebApi 应用程序和 apgeneric 类,如下所示:

namespace MyNamespace;

public class MyService<T>
{
    private readonly ILogger<MyService<T>> logger;

    public MyService(ILogger<MyService<T>> logger)
    {
        this.logger = logger;
    }

    public void DoWork()
    {
        logger.LogDebug("Hello World!");
    }
}

我尝试了以下配置来覆盖 MyService 内的日志级别,但没有成功:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "MyNamespace.MyService": "Debug"
      }
    }
  }
}

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "MyNamespace.MyService<>": "Debug"
      }
    }
  }
}

如何仅覆盖此类的日志级别?

c# serilog
1个回答
0
投票

你们非常接近。我有一个示例,其中我覆盖了控制器类的日志记录级别。

应用程序设置.json

   { "Serilog": {
      "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Debug", "Serilog.Sinks.File", "Serilog.Enrichers.Thread", "Serilog.Enrichers.Process", "Serilog.Expressions" ],
      "MinimumLevel": {
        "Override": {
          "SeriLogWebAPI.Controllers" : "Error"
        }
      },
      "WriteTo": [
        {
          "Name": "Console",
          "Args": {
            "outputTemplate": "[{Timestamp:yyyy:MM:dd hh:mm:ss} {CorrelationId} {Level:u3}] {Message:lj}{NewLine}{Exception}"
          }
        }]}}

WeatherForecastController.cs

using Microsoft.AspNetCore.Mvc;

namespace SeriLogWebAPI.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
            _logger.LogInformation("WeatherForecast controller called ");
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogInformation("WeatherForecast get method Starting.");
            _logger.LogDebug("WeatherForecast get method Starting.");
            _logger.LogWarning("WeatherForecast get method Starting.");
            _logger.LogCritical("WeatherForecast get method Starting.");
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }


    }
}

这会将我的日志记录限制为具有

Error
及以上日志级别的任何内容。这就是为什么在我的控制台上它只记录
Fatal/Critical
消息,而不记录其他较低级别的日志消息。

在您的情况下,您只需要包含类的名称空间。在您的

appsettings.json
中将
"MyNamespace.MyService<>"
替换为
"MyNamespace"
。如下所示:

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "MyNamespace": "Debug"
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.