2011-04-20 2 views
1

log4net을 사용하여 로깅 할 때 모든 로컬 변수 및 값 (inc. params)을 기록하는 방법이 있습니까?
로그 메시지에 각 값을 추가 할 수 있지만 더 간단한 방법이 있는지 궁금합니다.
나는 이것이 성능에 영향을 미칠 수 있음을 알고 있지만 그렇게 많이 사용되지는 않을 것입니다.log4net을 사용하여 현재 지역/매개 변수를 모두 기록하려면 어떻게합니까?

[log4net이 없으면 어떨까요? 모든 지역 주민을 포획하는 다른 방법이 있습니까?]

+1

에 몇 가지 매개 변수를 추가해야합니다,하지만 난 캐슬의 인터셉터를 사용하여 로깅 인터셉터를 생성 그러면 모든 매개 변수와 반환 값이 XML로 기록됩니다. 캐슬은 그런 동적 인 데코레이터를 만드는 데 아주 좋습니다. –

+0

[예외가 발생할 경우 모든 로컬 변수를 추적하는 방법] 가능한 복제본 (http://stackoverflow.com/questions/362124/how-to-trace-all-local-variables-when-an-exception-occurs) –

답변

2

log4net은 모든 매개 변수 및 지역을 기록하는 방법을 제공하지 않습니다. 당신은 내가 당신에게 그 정보를 얻을 수 StackFrame을 생각

Log.DebugFormat("{0}: {1}", /* get parameter name */, /* get parameter value */) 

같은 통화로 모든 자신을 인쇄 할 수 있습니다,하지만 그것은 단지 매개 변수 유형 및 방법의 반환 형식에 대해 알 수 있습니다. 현지인을 구할 방법이 없습니다.

Castle DynamicProxy과 같은 차단 프레임 워크를 사용해야합니다. 인터셉트 방법의 IInvocation 매개 변수는 인수

나는 모든 WCF 호출을 기록 인터셉터 tecnique를 사용했습니다
Log.DebugFormat("{0}.{1}({2})", invocation.TargetType.Name, invocation.Method.Name, string.Join(", ", invocation.Arguments)); 
0

을 제공합니다. 당신은 당신의 펜더 (컨트롤러, 액션, 사용자, DATAIN, 데이터 출력) 희망 나는 지역 주민을 캡처이없는이 도움

public interface IOpenUserName 
    { 
     string UserName { get; set; } 
    } 

    [AttributeUsage(AttributeTargets.Method)] 
    public class LogWcfAttribute : Attribute 
    { 

    } 

    public class LogWcfInterceptor : IInterceptor 
    { 
     private readonly ILogger _logger; 

     public LogWcfInterceptor(ILogger logger) 
     { 
      _logger = logger; 
     } 

     public void Intercept(IInvocation invocation) 
     { 
      if (WcfHelper.HasLogWcfAttribute(invocation.MethodInvocationTarget)) 
      { 
       Exception exception = null; 

       var openUser = (IOpenUserName) invocation.InvocationTarget; 

       log4net.LogicalThreadContext.Properties["controller"] = invocation.InvocationTarget.GetType().Name; 
       log4net.LogicalThreadContext.Properties["action"] = invocation.MethodInvocationTarget.Name; 

       log4net.LogicalThreadContext.Properties["user"] = openUser != null ? openUser.UserName : string.Empty; 
       log4net.LogicalThreadContext.Properties["datain"] = SerializeObject(invocation.Arguments); 

       try 
       { 
        invocation.Proceed(); 
       } 
       catch (Exception ex) 
       { 
        exception = ex; 
       } 
       finally 
       { 
        log4net.LogicalThreadContext.Properties["dataout"] = SerializeObject(invocation.ReturnValue); 
        _logger.Debug("OPENOTA", exception); 
       } 

       if (exception != null) throw exception; 
      } 
      else 
      { 
       invocation.Proceed(); 
      } 
     } 

     public static string SerializeObject(object toSerialize) 
     { 
      if (toSerialize == null) return string.Empty; 

      var xmlSerializer = new XmlSerializer(toSerialize.GetType()); 
      var textWriter = new StringWriter(); 

      xmlSerializer.Serialize(textWriter, toSerialize); 
      return textWriter.ToString(); 
     } 
    } 

    public static class WcfHelper 
    { 
     public static bool HasLogWcfAttribute(MethodInfo methodInfo) 
     { 
      return methodInfo.IsDefined(typeof(LogWcfAttribute), false); 
     } 
    } 
관련 문제