Log4Net 或 NLog (或其他记录器)中是否有一种方法可以以执行堆栈嵌套 XML 或 JSON 格式输出日志,这样 if 函数A()
calls 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记事本 http://xmlnotepad.codeplex.com/或一些JSON
-查看器(不知道有什么值得注意的......)在试图了解出了什么问题时快速折叠(不相关)或展开(相关)子调用。我用PostSharp http://www.postsharp.net记录(当前仅使用缩进)每个方法进入/退出和异常
日志记录框架没有有关方法边界的信息,因此它无法正确格式化 XML。您可以尝试扩展框架并将附加信息传递到日志记录方法中。
不过,获得此输出的更简单方法是在方面类中执行所有消息格式化,并将日志记录框架配置为仅输出消息文本,而不输出任何其他信息。
例如,在log4net配置:
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
在你的方面OnEntry http://doc.postsharp.net/content/M_PostSharp_Aspects_OnMethodBoundaryAspect_OnEntry方法,您将打开 XML 标签(或 JSON 对象),并在OnExit http://doc.postsharp.net/content/M_PostSharp_Aspects_OnMethodBoundaryAspect_OnExit方法关闭标签。您可以从下面的简单示例开始,并针对您的特定情况优化代码(例如,初始化记录器实例并格式化字符串运行时初始化, 编译时初始化方法)。
[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>");
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)