如何不借助appSettings配置NHibernate.Logging.Serilog?
NHibernate.Logging.Serilog 代码配置方案
当然可以完全脱离appSettings,通过代码直接配置NHibernate的Serilog日志,核心是手动配置Serilog实例并将其注册为NHibernate的日志提供者,步骤如下:
1. 确保安装必要NuGet包
需要安装以下包(根据项目类型调整):
NHibernateNHibernate.Logging.SerilogSerilog- 对应的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
相关产品推荐
相关产品推荐

