2

我正在使用Microsoft.Extensions.Logging.ILogger. 我只想在 LogLevel 设置为时记录请求对象Information

我知道我可以将请求对象记录为

_logger.LogInformation("{request}", request);

Serilog用作记录器。这会按预期将对象和日志请求序列化为 json 字符串。但是我不知道 Logging 框架是先检查日志级别然后序列化还是总是先序列化然后检查日志级别。因为如果 LogLevel 设置为高于 Information,我不想在每次调用时序列化对象。

无论如何检查 LogLevel 使用Microsoft.Extensions.Logging.ILogger

    private Microsoft.Extensions.Logging.ILogger<RoutesController> _logger = null;

    public RoutesController(Microsoft.Extensions.Logging.ILogger<RoutesController> logger)
    {            
        _logger = logger;
    }
    
    public void Route([FromBody]JObject request)
    {
       //how to check current LogLevel here?
        if(_logger.LogLevel == "Information")
        {
            _logger.LogInformation(JsonConvert.Serialize(request));
        }           
    }
4

1 回答 1

1

您应该可以使用以下IsEnabled方法ILogger<T>

if (_logger.IsEnabled(LogLevel.Information)
{
    //... 
}

另一种选择是使用 aLoggingLevelSwitch来控制最低级别并使其可供您的代码访问,以便您可以在以后执行检查。

var log = new LoggerConfiguration()
  .MinimumLevel.ControlledBy(LoggingLevelSwitches.GlobalLevelSwitch)
  .WriteTo.Console()
  .CreateLogger();

public class LoggingLevelSwitches
{
    public static readonly LoggingLevelSwitch GlobalLevelSwitch
        = new LoggingLevelSwitch(LogEventLevel.Information);
}

public void Route([FromBody]JObject request)
{
    // (example... You prob. would check for >= Information)
    if (LoggingLevelSwitches.GlobalLevelSwitch.MinimumLevel == LogEventLevel.Information)
    {
        _logger.LogInformation(JsonConvert.Serialize(request));
    }           
}

您还可LoggingLevelSwitch以为单个接收器使用多个实例(通常是一个名为 的参数restrictedToMinimumLevel)。请参阅Serilog,在运行时更改特定命名空间的日志级别 (> MinimumLevel)

于 2021-10-18T17:53:48.597 回答