2011-04-20 46 views
1

當使用log4net進行日誌記錄時,是否有辦法記錄所有本地變量和值(包含參數)?
我知道我可以將每個值添加到日誌消息,但想知道是否有一個更簡單的方法。
我也明白,這可能會影響性能,但是,它不會被使用太多。如何使用log4net記錄所有當前的本地/參數?

[沒有log4net怎麼樣?是否有另一種方法來捕捉所有當地人?]

+1

我沒有一個捕捉本地人,但我創建使用城堡的攔截日誌記錄攔截器將所有參數和返回值記錄爲XML。城堡非常適合創建這樣的動態裝飾器。 – 2011-04-20 22:17:52

+0

[如何在發生異常時跟蹤所有本地變量]的可能重複(http://stackoverflow.com/questions/362124/how-to-trace-all-local-variables-when-an-exception-occurs) – 2011-06-15 21:38:49

回答

2

log4net不提供記錄所有參數和當地人的方法。您可以通過調用全部打印出來自己喜歡

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

我想StackFrame能得到你的信息,但它只能告訴你有關的參數類型和方法的返回類型。沒有辦法讓當地人。

你將不得不使用攔截框架,如Castle DynamicProxy。截取方法的IInvocation參數提供的參數

Log.DebugFormat("{0}.{1}({2})", invocation.TargetType.Name, invocation.Method.Name, string.Join(", ", invocation.Arguments)); 
0

我用攔截器tecnique記錄所有通話WCF。 你需要一些參數添加到您的appender(控制器,動作,用戶,數據輸入,DATAOUT) 希望這有助於

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); 
     } 
    } 
相關問題