You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:30:00