1

我已经为 log4net 编写了一个 Singleton 包装器,它将在我的 WCF 服务的所有层中调用。我无法记录调用方法名称。请建议我的以下代码是否有任何输入。谢谢。

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Imports log4net
Imports System.Reflection

Public Class Logger
Implements ILog

Private Shared m_instance As Logger
Private Shared log As log4net.ILog = Nothing

Public Sub New()
    If log Is Nothing Then
        'log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType) ' -> This always logs 'Logger'
        log = log4net.LogManager.GetLogger(Assembly.GetCallingAssembly(), "MyLogger")  ' -> This always logs 'MyLogger'
    End If

End Sub

Public Shared ReadOnly Property Write() As Logger
    Get
        m_instance = New Logger()
        Return m_instance
    End Get
End Property

Public Sub Debug(msg As String) Implements ILog.Debug
    log.Debug(msg)
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''  

Public Interface ILog
     Sub Debug(msg As String)
End Interface
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

我已经使它更简单,如下所示来记录方法名称。但我必须将类名作为参数传递。请建议这是可接受的设计吗?

''''' Calling code ''''''''''''''''''''
Logger(of MyClassName).Debug("message")


''''''Log4net wrapper'''''''''''''''''''''
Imports log4net
Imports System.Reflection

Public NotInheritable Class Logger(Of T)

Private Shared log As log4net.ILog = Nothing

Private Shared ReadOnly Property LogProvider() As log4net.ILog
    Get
        If (log Is Nothing) Then
            Dim CallingMethod As String = GetType(T).ToString() & "." & (New StackTrace()).GetFrame(2).GetMethod().Name
            log = log4net.LogManager.GetLogger(CallingMethod)
        End If
        Return log
    End Get
End Property

Public Shared Sub Debug(msg As String)
    LogProvider.Debug(msg)
End Sub
4

1 回答 1

1

一个日志实例只能有一个名称,您不能更改它。如果您想在每个方法中使用不同的名称,您需要为 ech 方法创建一个记录器。

    log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType) ' -> This always logs 'Logger'
    log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().Name) ' -> This gives you the name of the current method
    log = log4net.LogManager.GetLogger(Assembly.GetCallingAssembly(), "MyLogger")  ' -> This always logs 'MyLogger'

在您的方法中创建记录器,例如:

    ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().Name) ' -> This gives you the name of the current method

您将拥有一个带有方法名称的记录器,我将添加类的名称:

    ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType + "." + MethodBase.GetCurrentMethod().Name) ' -> This gives you the name of the current method
于 2013-07-31T11:40:26.980 回答