为什么不将赋值状态替换为它的实际值?
这是因为 NHibernate 使用查询参数来输入值。这是有效的many案例,也有助于抵御 SQL 注入攻击。参数单独发送。如果按如下所述记录 SQL,您可以在底部找到它们。
您可以将每个 SQL 记录到文件中,如下所述。
这是通过以下方式实现的log4net.dll https://www.nuget.org/packages/log4net/;你需要添加参考。
添加命名空间如下:
using log4net;
using log4net.Appender;
using log4net.Core;
using log4net.Layout;
using log4net.Repository.Hierarchy;
配置log4net
在NHibernate中如下:
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();
FileAppender fileAppender = new FileAppender();
fileAppender.Name = "NHFileAppender";
fileAppender.File = logFilePath;
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.Layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss}:%m%n%n");
fileAppender.ActivateOptions();
Logger logger = hierarchy.GetLogger("NHibernate.SQL") as Logger;
logger.Additivity = false;
logger.Level = Level.Debug;
logger.AddAppender(fileAppender);
hierarchy.Configured = true;
您还需要设置ShowSql
而配置如下:
configuration.SetProperty(NHibernate.Cfg.Environment.ShowSql, "true");
configuration.SetProperty(NHibernate.Cfg.Environment.FormatSql, "true");
您需要在应用程序启动时调用此代码一次。输出日志还包括参数值。
以下是代码:
session.CreateSQLQuery("SELECT * FROM MyEntity WHERE MyProperty = :MyProperty")
.AddEntity(typeof(MyEntity))
.SetParameter("MyProperty", "filterValue")
.UniqueResult<MyEntity>();
以下是记录的查询:
2020-01-09 14:25:39:
SELECT
*
FROM
MyEntity
WHERE
MyProperty = @p0;
@p0 = 'filterValue' [Type: String (4000:0:0)]
可以看到,参数值filterValue
列在底部。
这适用于所有查询 API,例如IQueryOver
, IQuery
, ISQLQuery
etc.
这会记录成功和失败的语句。你可以玩FileAppender https://logging.apache.org/log4net/release/sdk/html/T_log4net_Appender_FileAppender.htm and Logger https://logging.apache.org/log4net/release/sdk/html/T_log4net_Repository_Hierarchy_Logger.htm类以满足您的额外要求。
另请参阅PatternLayout http://logging.apache.org/log4net/release/sdk/html/M_log4net_Layout_PatternLayout__ctor_1.htm from 文档 http://logging.apache.org/log4net/release/sdk/?topic=html/T_log4net_Layout_PatternLayout.htm。还可以找到更多详细信息here https://logging.apache.org/log4net/log4net-1.2.13/release/sdk/log4net.Layout.PatternLayout.html, here https://www.codejava.net/coding/common-conversion-patterns-for-log4js-patternlayout and here http://spoiledtechie.com/post/2015/11/19/Conversion-Patterns-for-Log4Net.aspx. This https://stackoverflow.com/q/1102026/5779732Q/A 也讨论了同样的问题。
以下问答也可能有帮助:
- 从 nHibernate 获取执行的 SQL https://stackoverflow.com/q/1264132/5779732
- 使用 log4net 写入不同的记录器 https://stackoverflow.com/q/17106559/5779732
- 如何使用 NHibernate 将 SQL 调用记录到 Visual Studio 的控制台? https://stackoverflow.com/q/474659/5779732
如您所见,这会在查询底部记录参数值。如果您希望将那些记录嵌入到查询中,请参阅this https://www.codeproject.com/Articles/249154/Logging-NHibernate-Queries-with-Parameters文章。