假设我有一些接受两个整数的函数。这是一种自动记录这样的消息的方法
"[Date][MethodNam]([first param],[second param]) - "
到目前为止我尝试了什么 - 指定以下布局模式:
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] [%C.%M] – %message%newline" />
答案 0 :(得分:2)
如果您正在使用像Windsor这样的IoC框架,您可以使用AOP(面向方面编程)为您的接口注入包装器。然后,您可以记录方法调用。以下是使用Windsor和IInteceptor接口的示例,这是我们使用的条带化版本,但有各种示例可用。
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Type targetType = invocation.TargetType ?? invocation.Method.DeclaringType;
ILog logger = LogManager.GetLogger(targetType);
//Probably want to check logger.IsDebugEnabled
if(invocation.Arguments.Count() == 0)
{
logger.DebugFormat("Method '{0}' called.", invocation.Method);
}
else
{
var stringBuilder = new StringBuilder("{" + invocation.Arguments.Length + "}");
for (int i = invocation.Arguments.Length - 1; i > 0; i--)
{
stringBuilder.Insert( 0, "{" + i + "}, " );
}
logger.DebugFormat("Method '{0}' called with parameters: " + stringBuilder, new[] { invocation.Method }.Union(invocation.Arguments).ToArray());
}
try
{
invocation.Proceed();
if (invocation.Method.ReturnType != typeof(void))
{
logger.DebugFormat("Method '{0}' returned: {1}", invocation.Method, invocation.ReturnValue);
}
}
catch(Exception ex)
{
logger.Error(string.Format("Method '{0}' threw exception:", invocation.Method), ex);
throw;
}
}
}
根据您的IoC框架,您应该能够连接各个组件。
注意事项:
这仅适用于接口方法,它不会连接对象上的私有方法。
答案 1 :(得分:0)
不知道什么是log4net,但你可以使用反射来获取运行时数据或调试功能,然后保存它,阅读更多here。
答案 2 :(得分:0)