有没有办法在使用log4net记录时记录所有局部变量和值(包括params)? 我知道我可以将每个值添加到日志消息中,但是想知道是否有更简单的方法 我也明白这可能会影响性能,但是它不会那么用。
[没有log4net怎么样?还有另一种捕获所有当地人的方法吗?]
答案 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);
}
}