是否有log4net的或NLOG的方式(或其他记录器)输出记录在执行堆栈嵌套XML或JSON格式,例如,如果函数A()
调用B(7)
的呼叫C("something")
,它会输出类似:
<Method name="A">
<Method name="B" params="(int) 7">
<Method name="C" params="(string) 'something'"/>
</Method>
</Method>
甚至更好:
<Method name="A">
<Method name="B" params="(int) 7">
<Params>
<int>7</int>
</Params>
<Method name="C">
<Params>
<string>something</string>
</Params>
</Method>
</Method>
</Method>
为什么?因此,在尝试了解发生了什么事时,我可以使用(例如)XML记事本或某些JSON
-viewer(不知道任何出色的...)来快速折叠(不相关)或展开(相关)子调用错误。我PostSharp
用来记录(当前仅使用缩进)每个方法的进入/退出和异常
日志记录框架没有有关方法边界的信息,因此无法正确格式化XML。您可以尝试扩展框架,并将其他信息传递到日志记录方法中。
不过,获得此输出的更简单方法是在Aspect类中执行所有消息格式化,并将日志记录框架配置为仅输出消息文本,而没有任何其他信息。
例如,在log4net配置中:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
在方面的OnEntry方法中,您将打开XML标签(或JSON对象),在OnExit方法中,关闭标签。您可以从下面的简单示例开始,然后针对特定情况优化代码(例如,初始化记录器实例并在RuntimeInitialize和CompileTimeInitialize方法中格式化字符串)。
[Serializable]
public class XmlLogAttribute : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
ILog log = LogManager.GetLogger(args.Method.DeclaringType);
if (log.IsDebugEnabled)
{
log.DebugFormat("<Method name=\"{0}\">", args.Method.Name);
log.Debug("<Params>");
foreach (object methodArgument in args.Arguments)
{
if (methodArgument == null)
{
log.Debug("<null/>");
}
else
{
log.DebugFormat("<{0}>{1}</{0}>", methodArgument.GetType(), methodArgument);
}
}
log.Debug("</Params>");
}
}
public override void OnExit(MethodExecutionArgs args)
{
ILog log = LogManager.GetLogger(args.Method.DeclaringType);
log.Debug("</Method>");
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句