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

如何不借助appSettings配置NHibernate.Logging.Serilog?

NHibernate.Logging.Serilog 代码配置方案

当然可以完全脱离appSettings,通过代码直接配置NHibernate的Serilog日志,核心是手动配置Serilog实例并将其注册为NHibernate的日志提供者,步骤如下:

1. 确保安装必要NuGet包

需要安装以下包(根据项目类型调整):

  • NHibernate
  • NHibernate.Logging.Serilog
  • Serilog
  • 对应的Serilog输出目标包(如Serilog.Sinks.Console、Serilog.Sinks.File等)

2. 代码配置步骤

基础控制台/桌面应用示例

在应用启动、NHibernate初始化之前,完成Serilog配置和NHibernate日志提供者注册:

// 1. 手动配置Serilog实例
var serilogLogger = new LoggerConfiguration()
    .MinimumLevel.Debug() // 设置全局最低日志级别
    .MinimumLevel.Override("NHibernate", Serilog.Events.LogEventLevel.Debug) // 单独指定NHibernate的日志级别
    .WriteTo.Console() // 输出到控制台
    .WriteTo.File(
        path: "nhibernate-logs.txt",
        rollingInterval: RollingInterval.Day,
        retainedFileCountLimit: 7
    ) // 按天滚动生成日志文件,保留7天
    .CreateLogger();

// 2. 将Serilog注册为NHibernate的日志提供者
NHibernateLogger.SetLogProvider(new SerilogLoggerProvider(serilogLogger));

// 3. 初始化NHibernate SessionFactory(示例)
var nhConfig = new Configuration();
nhConfig.DataBaseIntegration(db =>
{
    db.Dialect<MsSql2012Dialect>();
    db.ConnectionString = "your-db-connection-string";
});
nhConfig.AddAssembly(typeof(YourEntity).Assembly);
var sessionFactory = nhConfig.BuildSessionFactory();

ASP.NET Core 集成示例

结合依赖注入系统配置,同时确保NHibernate使用Serilog:

var builder = WebApplication.CreateBuilder(args);

// 1. 配置Serilog(替代默认日志系统)
builder.Host.UseSerilog((context, config) =>
{
    config.MinimumLevel.Debug()
          .MinimumLevel.Override("NHibernate", Serilog.Events.LogEventLevel.Information)
          .WriteTo.Console()
          .WriteTo.File("nhibernate-logs.txt", RollingInterval.Day);
});

// 2. 注册NHibernate SessionFactory,同时绑定Serilog日志
builder.Services.AddSingleton<ISessionFactory>(sp =>
{
    var logger = sp.GetRequiredService<ILogger<ISessionFactory>>();
    // 注册Serilog日志提供者
    NHibernateLogger.SetLogProvider(new SerilogLoggerProvider(logger));

    // 代码配置NHibernate(无需依赖hibernate.cfg.xml)
    var nhConfig = new Configuration();
    nhConfig.DataBaseIntegration(db =>
    {
        db.Dialect<PostgreSQLDialect>();
        db.ConnectionString = builder.Configuration.GetConnectionString("DefaultConnection");
        db.LogSqlInConsole = false; // 关闭NHibernate自带的SQL日志,统一用Serilog输出
    });
    nhConfig.AddAssembly(typeof(Product).Assembly);
    return nhConfig.BuildSessionFactory();
});

var app = builder.Build();
// ... 后续中间件配置

3. 额外配置说明

  • 可以通过NHibernateLogger.For<T>()单独调整某类NHibernate组件的日志级别,例如:
    // 仅记录NHibernate SQL相关的警告及以上日志
    NHibernateLogger.For(typeof(NHibernate.SqlCommand.SqlString)).Level = NHibernateLogLevel.Warn;
    
  • 所有Serilog的高级配置(如日志 enrichment、自定义输出格式、第三方sink集成)都可以通过代码实现,完全脱离配置文件。

内容的提问来源于stack exchange,提问作者lunatic84

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:30:32