使用参数值记录错误的NHibernate查询

时间:2018-02-06 15:02:11

标签: .net nhibernate log4net

我发现如何使用log4net记录NHibernate查询,我还发现如何在OnPrepareStatement方法中使用IInterceptor记录查询。

但我真正需要的是如何在失败时记录NHibernate查询(fe ORA错误)。 IInterceptor方法有一种方法,但它没有为我提供记录参数值的方法。我提出的解决方案也不是线程安全的。

有人有更好的想法吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

以下是一些自定义代码,它是IMethodInvocation参数的一部分。这段代码基本上是一个实现IInterceptionBehavior的新文件。 GetParam是粗略的,但它获得了价值。

        ''' <summary>
        ''' this can be changed to handle a multitude of parameters/enhancements
        ''' </summary>
        ''' <param name="input"></param>
        ''' <returns></returns>
        Private Function GetParam(input As IMethodInvocation) As Object

            'access MethodInvocation
            Dim count = input.Inputs.Count
            Dim param As New Object
            If count <> 0 Then
                param = input.Inputs.Item(0)
                Return param
            End If

            'nothing
            Return Nothing
        End Function`

以下是它的使用方法。

Public Function Invoke(input As IMethodInvocation, getNext As GetNextInterceptionBehaviorDelegate) As IMethodReturn Implements IInterceptionBehavior.Invoke
             ' Before invoking the method on the original target. 
            Dim icp As ClaimsPrincipal = TryCast(Thread.CurrentPrincipal, ClaimsPrincipal)

            ' Access IClaimsIdentity which contains claims
            Dim claimsIdentity As ClaimsIdentity = DirectCast(icp.Identity, ClaimsIdentity)
            Dim param = GetParam(input)

                If param IsNot Nothing Then
                    WriteLog([String].Format("{0} is invoking method {1} at {2} with a parameter of {3}", claimsIdentity.Name, input.MethodBase, DateTime.Now.ToLongTimeString(), param))
                Else
                    WriteLog([String].Format("{0} is invoking method {1} at {2} without a parameter", claimsIdentity.Name, input.MethodBase, DateTime.Now.ToLongTimeString()))
                End If


            Return result
        End Function