我正在使用NLog日志记录框架,并尝试在任何UDP记录器应用程序中显示异常和堆栈跟踪信息,例如Sentinel和Log2Console,但只能获取显示日志消息部分。输出到文件的效果很好,因为大多数示例都是如此,因此问题围绕着使用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>
部分链接:
修改 在搜索了一些之后,这似乎是对NLog结束的限制。最近的补丁显然在那里:log4jxmlevent does not render Exception
EDIT2: 我用补丁重建了NLog,但它似乎没有在Sentinel或Log2Console应用程序中提供帮助。我可能必须尝试使用log4net来确保这些应用确实支持我想要实现的目标。
EDIT3: 我目前使用string.Format()来自己加入和格式化消息和异常文本。这很好用,但不是我在这里寻找的。 p>
答案 0 :(得分: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>
答案 1 :(得分:2)
我遇到了这个问题,刚刚将我的NLog nuget包更新为2.0.1.2
现在我对Log2Console有异常了。
答案 2 :(得分:2)
几年后,这非常简单,尝试添加
includeSourceInfo =&#34;真&#34;
到您的目标文件,看起来像;
<target name="viewer"
xsi:type="NLogViewer"
includeSourceInfo="true"
address="udp://127.0.0.1:9999" />
提供源文件,行,类和方法信息。
答案 3 :(得分:1)
您是否尝试过Chainsaw的最新开发者快照?它将显示堆栈跟踪并支持log4net / UDP appender,根据NLog,您也可以使用它: http://nlog-project.org/wiki/Chainsaw_target
尝试使用最新的开发人员快照,具有大量功能:http://people.apache.org/~sdeboy
答案 4 :(得分:1)
只需从GitHub下载并构建最新的(NLog-Build-2.0.0.2007-0-g72f6495)来源:https://github.com/jkowalski/NLog/tree/ 这个问题由NLog开发人员修复。
答案 5 :(得分: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=*}
有关此外观的更多信息here。