假设我有一些接受两个整数的函数。是否可以自动记录这样的消息
"[Date][MethodNam]([first param],[second param]) - "
到目前为止我尝试了什么 - 指定以下布局模式:
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] [%C.%M] – %message%newline" />
如果您使用的是 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 框架,您应该能够连接各个组件。
注意事项:
这仅适用于接口方法,它不会连接对象上的私有方法。
不知道什么是 log4net,但是您可以使用反射来获取运行时数据或调试功能,然后保存,请在此处阅读更多内容。