如何通过Microsoft.Extensions.Logging.ILogger检查当前日志级别
解决方案
方法1:使用ILogger自带的IsEnabled方法判断
Microsoft.Extensions.Logging.ILogger 接口原生提供了 IsEnabled(LogLevel level) 方法,用于检查当前日志实例是否启用了指定的日志级别,你可以直接用这个方法实现需求。
修改后的代码示例:
private Microsoft.Extensions.Logging.ILogger<RoutesController> _logger = null; public RoutesController(Microsoft.Extensions.Logging.ILogger<RoutesController> logger) { _logger = logger; } public void Route([FromBody]JObject request) { // 检查Information级别是否启用 if(_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation("{request}", JsonConvert.SerializeObject(request)); } }
方法2:直接使用结构化日志模板,无需手动判断
你不需要自己手动做级别判断和序列化操作,Serilog以及微软日志抽象的默认实现逻辑是:先校验日志级别是否启用,再执行参数的序列化、模板渲染操作。如果当前日志级别高于Information,日志框架会直接跳过后续所有处理,不会产生序列化的性能损耗。
你可以直接简化代码为:
public void Route([FromBody]JObject request) { // 使用@解构符号,Serilog会自动将对象序列化为结构化JSON属性,比手动序列化为字符串更利于后续日志检索 _logger.LogInformation("{@Request}", request); }
这种写法既省去了手动判断的代码,也不会在日志级别未启用时产生多余的序列化开销,同时还能保留结构化日志的特性,更推荐使用。
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

