gpt4 book ai didi

c# - Log4Net 或 NLog(或其他一些记录器)是否有办法以执行堆栈嵌套的 XML 或 JSON 格式输出日志?

转载 作者:太空狗 更新时间:2023-10-29 21:54:15 27 4
gpt4 key购买 nike

在 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 Notepad或一些 JSON-viewer(不知道有什么了不起的……)在试图了解出了什么问题时快速折叠(不相关)或展开(相关)子调用。我用 PostSharp记录(目前仅使用缩进)每个方法进入/退出和异常

最佳答案

日志框架没有关于您的方法边界的信息,因此它无法适本地格式化 XML。您可以尝试扩展框架并将附加信息传递到日志记录方法中。

虽然获得此输出的更简单方法是在方面类中执行所有消息格式化,并将日志记录框架配置为仅输出消息文本而不输出任何其他信息。

例如,在log4net配置中:

<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>

在你方面的OnEntry您将打开 XML 标记(或 JSON 对象)的方法,并在 OnExit 中方法关闭标签。您可以从下面的简单示例开始,并针对您的特定情况优化代码(例如,在 RuntimeInitializeCompileTimeInitialize 方法中初始化记录器实例和格式化字符串)。

[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>");
}
}

关于c# - Log4Net 或 NLog(或其他一些记录器)是否有办法以执行堆栈嵌套的 XML 或 JSON 格式输出日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20730298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com