如何使用log4net记录所有当前本地/参数?

时间:2011-04-20 17:35:27

标签: logging log4net

有没有办法在使用log4net记录时记录所有局部变量和值(包括params)? 我知道我可以将每个值添加到日志消息中,但是想知道是否有更简单的方法 我也明白这可能会影响性能,但是它不会那么用。

[没有log4net怎么样?还有另一种捕获所有当地人的方法吗?]

2 个答案:

答案 0 :(得分:2)

log4net不提供记录所有参数和本地的方法。您可以通过

等电话自行打印
Log.DebugFormat("{0}: {1}", /* get parameter name */, /* get parameter value */)

我在想StackFrame可以获取这些信息,但它只能告诉你有关参数类型和方法返回类型的信息。没有办法让当地人。

您必须使用Castle DynamicProxy之类的拦截框架。 Intercept方法的IInvocation参数提供参数

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

答案 1 :(得分:0)

我使用拦截器技术记录所有WCF调用。 您需要向appender添加一些参数(控制器,操作,用户,数据输入,数据输出) 希望这个帮助

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);
        }
    }