gpt4 book ai didi

exception - 如何在 NLog 中记录网络目标的异常

转载 作者:行者123 更新时间:2023-12-04 06:43:57 33 4
gpt4 key购买 nike

我正在使用 NLog日志框架,并试图获取出现在任何 UDP 记录器应用程序中的异常和堆栈跟踪信息,例如 SentinelLog2Console ,但只能获取显示的日志消息部分。输出到文件效果很好,因为大多数示例都是这样做的,因此问题围绕着将网络目标与 NLog 一起使用。

如果自定义格式可以应用于内部异常和堆栈跟踪,则奖励,但这不是必需的。 Exception.ToString() 会有很长的路要走。

示例代码注意事项:使用 Log2Console我找到了一个 article关于如何将异常作为单独的日志条目发送。虽然这有效,但我对解决方案并不满意。

示例异常记录代码:

Logger Log = LogManager.GetCurrentClassLogger();

try
{
throw new InvalidOperationException("My ex", new FileNotFoundException("My inner ex1", new AccessViolationException("Innermost ex")));
}
catch (Exception e)
{
Log.ErrorException("TEST", e);
}

示例 NLog.config:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<targets async="true">

<!-- Send by UDP to Sentinel with NLogViewer protocol -->
<target name="network" xsi:type="NLogViewer" address="udp://192.168.1.3:9999" layout="${message}${onexception:inner=${newline}${exception:format=tostring}}" />

<!-- Send message by UDP to Log2Console with Chainsaw protocol -->
<target name="network2" xsi:type="Chainsaw" address="udp://192.168.1.3:9998" appinfo="Grocelist"/>

<!-- Send exception/stacktrace by UDP to Log2Console with generic network protocol -->
<target name="network2ex" xsi:type="Network" address="udp4://192.168.1.3:9998" layout="${exception:format=ToString}" />

<target name="logfile" xsi:type="File" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=tostring}"
createDirs="true"
fileName="${basedir}/logs/${shortdate}.log"
/>
</targets>

<rules>
<logger name="*" minlevel="Debug" writeTo="logfile" />
<logger name="*" minlevel="Debug" writeTo="network" />
<logger name="*" minlevel="Debug" writeTo="network2" />
<logger name="*" minlevel="Warn" writeTo="network2ex" />
</rules>
</nlog>

部分链接:
  • http://nlog-project.org
  • http://nlog-project.org/wiki/Targets
  • http://nlog-project.org/wiki/Exception_layout_renderer
  • http://nlog-project.org/2011/04/20/exception-logging-enhancements.html
  • http://nlog-project.org/wiki/How_to_properly_log_exceptions%3F
  • How to tell NLog to log exceptions?
  • https://stackoverflow.com/a/9684111/134761
  • http://nlog-forum.1685105.n2.nabble.com/How-to-send-stacktrace-of-exceptions-to-Chainsaw-or-Log2Console-td5465045.html

  • 编辑:
    在搜索更多之后,这似乎是 NLog 端的限制。最近的补丁显然在那里: log4jxmlevent does not render Exception

    编辑 2:
    我用补丁重建了 NLog,但它似乎对 Sentinel 或 Log2Console 应用程序没有帮助。我可能必须尝试 log4net 以确保这些应用程序确实支持我想要实现的目标。

    编辑 3:
    我目前使用 string.Format() 自己加入和格式化消息和异常文本。这很有效,但不是我在这里寻找的。

    最佳答案

    您还可以扩展 NLog 以包含网络日志记录的异常。

    创建扩展布局:

    [Layout("Log4JXmlEventLayoutEx")]    
    public class Log4JXmlEventLayoutEx : Log4JXmlEventLayout
    {
    protected override string GetFormattedMessage(LogEventInfo logEvent)
    {
    string msg = logEvent.Message + " ${exception:format=Message,Type,ToString,StackTrace}";
    msg = SimpleLayout.Evaluate(msg, logEvent);
    LogEventInfo updatedInfo;
    if (msg == logEvent.Message) {
    updatedInfo = logEvent;
    } else {
    updatedInfo = new LogEventInfo(
    logEvent.Level, logEvent.LoggerName,
    logEvent.FormatProvider, msg,
    logEvent.Parameters, logEvent.Exception);
    }
    return base.GetFormattedMessage(updatedInfo);
    }
    }

    创建一个使用该布局的目标
    [Target("NLogViewerEx")]
    public class NLogViewerTargetEx : NLogViewerTarget
    {
    private readonly Log4JXmlEventLayoutEx layout = new Log4JXmlEventLayoutEx();
    public override Layout Layout { get { return layout; } set {} }
    }

    更新 NLog.config:
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <extensions>
    <add assembly="Assembly.Name.That.Contains.Extended.Target"/>
    </extensions>
    <targets>
    <target name="logViewer"
    xsi:type="NLogViewerEx"
    address="udp://localhost:7071">
    </targets>
    ...
    </nlog>

    关于exception - 如何在 NLog 中记录网络目标的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9990591/

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