當出現異常時,似乎有大量關於如何記錄額外信息的信息和文檔,但我在嘗試解決如何創建基本上是異常的蜜罐的目標時遇到問題。我不想篩選各種日誌文件,試圖查看是否記錄了任何異常,我只想將所有異常的副本轉到寫入exceptions.log文件的特定目標。如何配置NLog目標以僅記錄異常?
我該怎麼做?
當出現異常時,似乎有大量關於如何記錄額外信息的信息和文檔,但我在嘗試解決如何創建基本上是異常的蜜罐的目標時遇到問題。我不想篩選各種日誌文件,試圖查看是否記錄了任何異常,我只想將所有異常的副本轉到寫入exceptions.log文件的特定目標。如何配置NLog目標以僅記錄異常?
我該怎麼做?
我不能說我實際上已經嘗試過這種方式,但是您可以使用when filter和condition來實現您想要的功能。
下面是來自condition
頁面的例子:
<rules>
<logger name="*" writeTo="file">
<filters>
<when condition="length(message) > 100" action="Ignore" />
<when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" />
<when condition="(level >= LogLevel.Debug and contains(message,'PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" />
<when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" />
</filters>
</logger>
</rules>
爲了實現自己的目標,你可以打一個filter
這樣的:
<rules>
<logger name="*" writeTo="file">
<filters>
<when condition="length('${exception}') > 0" action="Log" />
</filters>
</logger>
</rules>
的想法是,你只是要記錄的如果異常字符串的長度大於0,則顯示消息。某些示例使用NLog LayoutRenderer語法(例如${message}
),有些則沒有(例如message
)。我不確定在哪種情況下使用哪種語言或哪種語法。我上面直接發佈的示例可能會導致僅在存在異常時記錄消息。您還應該能夠進行配置,以便將「正常」記錄到一個目標的郵件,並且只有存在例外時才記錄到「ExceptionHoneypotTarget」的郵件。
也許是這樣的:
<rules>
<logger name="*" writeTo="ExceptionHoneypot">
<filters>
<when condition="length('${exception}') > 0" action="Log" />
</filters>
</logger>
<logger name="*" writeTo="file">
</logger>
</rules>
正如我提到的早,我還沒有真正嘗試任何的這一點,但它似乎像你應該能夠做到這一點,希望類似於上面顯示什麼。
或者,你可以在你的蜜罐目標周圍使用FilteringWrapper。該配置可能是這個樣子:
<?xml version="1.0" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="Honeypot" xsi:type="FilteringWrapper"
condition="length('${exception}')>0">
<target xsi:type="File" fileName="${basedir}/Honeypot.txt" />
</target>
<target name="normal" xsi:type="File" fileName="${basedir}/Log.txt" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="Honeypot,normal" />
</rules>
</nlog>
我基於從here爲例FilteringWrapper
例子。如果我的配置正確,它的工作方式是將所有消息都記錄到「Log.txt」,並且具有非空異常的消息將記錄到「Honeypot.txt」。
請注意,如果你想只例外您的過濾器應該是:
<when condition="length('${exception}') = 0" action="Ignore" />
啊很大的答案,謝謝。 – 2012-02-17 13:01:21
我試過這個解決方案,但我不得不用下面這樣的單引號括起$ {exception}:length('$ {exception}')。我已經提交了新版本以供同行評審。 – 2012-03-06 09:13:26