8

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

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

注意示例代码:使用Log2Console,我找到了一篇关于如何将异常作为单独的日志条目发送的文章。尽管这可行,但我对解决方案并不满意。

示例异常记录代码:

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>

一些链接:

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

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

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

4

6 回答 6

4

您还可以扩展 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>
于 2013-03-20T09:34:19.837 回答
2

我遇到了这个问题,刚刚将我的 NLog nuget 包更新为 2.0.1.2

现在我有异常通过 Log2Console 就好了。

于 2013-04-30T12:11:27.187 回答
2

几年后,这很简单,尝试添加

包括来源信息=“真”

到你的目标文件,所以它看起来像;

 <target name="viewer"
            xsi:type="NLogViewer"
            includeSourceInfo="true"
            address="udp://127.0.0.1:9999" />

为您提供源文件、行、类和方法信息。

于 2015-11-16T21:41:51.073 回答
1

在您的 NLog.config 中修改目标,如下所示。

<target name="file" xsi:type="File" fileName="log.txt" layout="${longdate}:${message} ${exception:format=message,stacktrace:separator=*}" /> 

您正在寻找的部分是

${exception:format=message,stacktrace:separator=*}

有关此外观的更多信息,请点击此处

于 2013-04-18T19:13:37.667 回答
1

您是否尝试过 Chainsaw 的最新开发者快照?它将显示堆栈跟踪并支持 log4net/UDP 附加程序,根据 NLog,您也可以使用它: http: //nlog-project.org/wiki/Chainsaw_target

试试最新的开发者快照,有很多功能: http: //people.apache.org/~sdeboy

于 2012-04-03T22:51:11.120 回答
1

只需从 GitHub 下载并构建最新的 (NLog-Build-2.0.0.2007-0-g72f6495) 源:https ://github.com/jkowalski/NLog/tree/ 此问题已由 NLog 开发人员修复。

于 2012-04-04T14:20:21.667 回答