如何通过Serilog按命名空间和类配置不同日志级别?
问题分析与解决
你遇到的问题核心在于:Serilog的MinimumLevel.Override规则是针对带有上下文(命名空间/类)的Logger实例生效的,而直接使用静态Log.Debug调用时,日志没有关联到SerilogTesting.Program这个类的上下文,所以Override配置不会被触发。
解决方案:使用类关联的Logger实例
修改Program类的代码,创建一个与当前类绑定的Logger实例,而非直接使用全局静态Log类:
using Commons; using Serilog; using Serilog.Events; using System; namespace SerilogTesting { internal class Program { // 创建与Program类关联的Logger实例 private static readonly ILogger _logger = Log.ForContext<Program>(); static void Main(string[] args) { try { Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .MinimumLevel.Override("SerilogTesting.Program", LogEventLevel.Debug) .WriteTo.Console() .CreateLogger(); // 使用类关联的Logger输出Debug日志 _logger.Debug($"{nameof(Program.Main)} started."); var logic = new DoSomething(); logic.Rain(); } catch { } finally { Log.CloseAndFlush(); } } } }
原理说明
Log.ForContext<Program>()会创建一个带有SerilogTesting.Program上下文标记的Logger实例,Serilog会根据这个标记匹配你配置的MinimumLevel.Override规则。- 全局的
MinimumLevel.Information()依然会过滤掉其他没有Override配置的类/命名空间的Debug及以下级别日志(比如如果DoSomething里写Log.Debug,依然不会输出)。 - 如果希望整个
SerilogTesting命名空间下的类都能输出Debug日志,可以把Override的目标改为"SerilogTesting",然后每个类都通过Log.ForContext<当前类>()创建Logger实例即可。
内容的提问来源于stack exchange,提问作者Mircea Ion
相关产品推荐
相关产品推荐

