2012-04-03 46 views
7

我正在使用NLog日誌框架,並且試圖獲取任何UDP記錄器應用程序中顯示的異常和堆棧跟蹤信息,例如SentinelLog2Console,但只能獲取日誌消息部分顯示。輸出到一個文件的效果很好,因爲大多數例子都是這樣做的,所以這個問題圍繞着使用NLog的網絡目標展開。如何在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補丁,但它似乎並沒有哨兵或Log2Console應用提供幫助。我可能必須嘗試使用​​log4net來確保這些應用程序確實支持我試圖實現的目標。

編輯3: 我目前使用string.Format()來加入並格式化消息和例外文本。這很好,但不是我在這裏尋找的。

+0

Github上的NLogViewerTarget的源代碼顯示佈局集{}爲空操作,因此您不能覆蓋不包含例外的默認值。 – 2016-05-11 20:04:28

回答

1

您是否嘗試過Chainsaw的最新開發者快照?它會顯示堆棧跟蹤和支持log4net的/ UDP附加目的地,並根據NLOG你可以使用它,以及: http://nlog-project.org/wiki/Chainsaw_target

嘗試最新的開發快照,有一噸的特點:http://people.apache.org/~sdeboy

+0

我感覺不好,但我似乎無法弄清楚如何在Windows上運行最新的快照?該zip文件只包含一個.bat文件,通過閱讀它我無法弄清楚我需要做些什麼才能使它工作。 – angularsen 2012-04-04 07:18:33

+0

您需要安裝Java運行時。一旦你這樣做了,你可以將壓縮文件保存到文件系統並解壓縮,導航到apache-chainsaw-2.1.0-SNAPSHOT \ bin文件夾並運行chainsaw.bat命令。這應該做到這一點。 – Scott 2012-04-04 18:42:44

1

只需下載和建設最新的(NLog-Build-2.0.0。2007-0-g72f6495)來自GitHub:https://github.com/jkowalski/NLog/tree/ 此問題已由NLog開發人員修復。

+0

您也可以從這裏下載編譯的二進制文件http://nlog.codeplex.com/releases/view/81084 – gschuager 2012-10-28 18:33:19

3

您還可以擴展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> 
+0

謝謝你這個不錯的解決方案! – 2016-07-20 11:43:47

+0

嗨,亞歷克斯,是否有可能爲兩個目標有兩個自定義佈局? '哨兵'和'文件?我卡住了,它不起作用(https://stackoverflow.com/q/47753773/6229375) - (鏈接已更新)。 – 2017-12-12 07:29:27

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

+0

這僅用於文件目標,對不對?問題是獲取網絡目標的異常信息。 – angularsen 2013-04-24 06:06:04

+0

啊,我一定錯過了。是的,這是爲了輸出到文件。 GL獲得網絡解決方案。 – JabberwockyDecompiler 2013-04-29 13:38:48

2

我有這個問題,並且剛剛更新了我的NLOG NuGet包到2.0.1.2

現在我有例外通過即將Log2Console就好了。

+0

非常感謝您的支持,我將不得不重新訪問這些內容並自己嘗試!你還可以發佈你的配置嗎? – angularsen 2013-04-30 17:42:29

2

幾年後,這是相當瑣碎,嘗試添加

includeSourceInfo = 「真」

到目標文件,所以它看起來像;

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

爲您提供源文件,行,類和方法信息。

+0

謝謝,下次再次遇到NLog和UDP時,我會試試這個。 – angularsen 2015-11-16 21:43:24

+0

可悲的是仍然沒有簡單的方法來獲得堆棧跟蹤!在Release模式下運行剝離了很多源代碼信息..我會避免這種方法更長時間:-) – keithl8041 2015-11-16 21:51:40