NLog

NLog.Elmah

NLog.Elmah套件,是用來擴充NLog的Target,可以寫到Elmah去 Elmah的用法可以參考之前的筆記 在設定好Elmah之後,開始來安裝NLog.Elmah 首先透過NuGet來安裝套件 [![](http://3.bp.blogspot.com/-7-Ra6YAOsCg/VBqk41izCYI/AAAAAAAABmI/cfGfIw-fulU/s1600/01.%E5%AE%89%E8%A3%9D%E5%A5%97%E4%BB%B6.png)](http://3.bp.blogspot.com/-7-Ra6YAOsCg/VBqk41izCYI/AAAAAAAABmI/cfGfIw-fulU/s1600/01.%E5%AE%89%E8%A3%9D%E5%A5%97%E4%BB%B6.png) 再來設定NLog來套用Elmah 主要是透過extensions來引用NLog.Elmah這個Assembly 就可以透過Elmah這個Target,把Log寫到Elmah去 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> &lt;extensions&gt; &lt;add assembly="NLog.Elmah"/&gt; &lt;/extensions&gt; &lt;targets&gt; &lt;target xsi:type="Elmah" name="elmah" layout="${longdate} ${uppercase:${level}} ${message}"/&gt; &lt;/targets&gt; &lt;rules&gt; &lt;logger name="*" minlevel="Trace" writeTo="elmah" /&gt; &lt;/rules&gt; </nlog> 就可以在elmah中看到寫出的記錄,只是沒有Type,HttpStatusCode也都是0 [![](http://2.bp.blogspot.com/-IlyVebdJVBw/VBqmnO3VBJI/AAAAAAAABmU/MfcOlbctXZQ/s1600/02.%E5%AF%AB%E5%87%BA.png)](http://2.bp.blogspot.com/-IlyVebdJVBw/VBqmnO3VBJI/AAAAAAAABmU/MfcOlbctXZQ/s1600/02.%E5%AF%AB%E5%87%BA.png) 如果加上LogLevelAsType="true"這個屬性 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true"> &lt;extensions&gt; &lt;add assembly="NLog.Elmah"/&gt; &lt;/extensions&gt; &lt;targets&gt; &lt;target xsi:type="Elmah" name="elmah" LogLevelAsType="true" layout="${longdate} ${uppercase:${level}} ${message}"/&gt; &lt;/targets&gt; &lt;rules&gt; &lt;logger name="*" minlevel="Trace" writeTo="elmah" /&gt; &lt;/rules&gt; </nlog>


Common.Logging

在開始使用log4net或NLog這種Logging元件來處理log,是一個很美好的開發經驗,但在開發類別庫專案的時後,會碰到循環參考的問題,這時後改用Common.Logging會比較好 Common.Logging是一個Log介面,可以支援log4net、NLog、Enterprise Library Logging,透過設定檔把Log轉接到真正要使用的Log元件,在日後轉換Log元件的時後很方便,詳細的介紹可以參考官網,以下用一個類別庫專案搭配一個應用程式來介紹這個元件的使用方式 Common.Logging 2.2.0版之後,相依於Common.Logging.Core套件 應該是為了可儶性,把介面和抽象類別分離到Core套件 在套件的使用上要做點調整 Common Logging 2.3.1版之後,已不再使用Common.Logging.Core 為了比較好在Log套件的多個版本之間切換,對應的Log套件後面都會有指定的版本 例如Common.Logging.NLog31對應到NLog 3.1版本 首先開啟一個類別庫專案,並透過NuGet加入Common.Logging參考 [![](http://1.bp.blogspot.com/-YZT52XVZA3Q/VHKbhm-Vn9I/AAAAAAAABvo/xwz2a-Mpg_Q/s1600/01.NuGet%E5%A5%97%E4%BB%B6.png)](http://1.bp.blogspot.com/-YZT52XVZA3Q/VHKbhm-Vn9I/AAAAAAAABvo/xwz2a-Mpg_Q/s1600/01.NuGet%E5%A5%97%E4%BB%B6.png) 簡單寫一個函式讓之後引用的程式來呼叫 using Common.Logging; namespace ClassLibrary1 { public class Class1 { private ILog log = LogManager.GetLogger<Class1>()); public void SayHello() { this.log.Info("Hello"); } } } 再來新增一個Windows Form應用程式,並引用剛寫的庫別庫專案 [![](http://4.bp.blogspot.com/-xaXV4Oh0V4A/Urk59141GjI/AAAAAAAAA4o/tmXK3kNuKj0/s1600/02.ref.png)](http://4.bp.blogspot.com/-xaXV4Oh0V4A/Urk59141GjI/AAAAAAAAA4o/tmXK3kNuKj0/s1600/02.ref.png) 簡單寫一個Button Click來呼叫類別庫中的函式 using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { ClassLibrary1.


好用的LogViewer

Log2Console是個好用的Log Viewer,可以配合Log4Net或NLog使用 首先到官網下載 [![](http://1.bp.blogspot.com/-1SU04Sq3oOc/UndxtGbDi3I/AAAAAAAAA14/21nZBzzTQVg/s1600/01.download.png)](http://1.bp.blogspot.com/-1SU04Sq3oOc/UndxtGbDi3I/AAAAAAAAA14/21nZBzzTQVg/s1600/01.download.png) 安裝好後先設定接收方式 [![](http://4.bp.blogspot.com/-hx4I28pk5po/Undxwe6iabI/AAAAAAAAA2A/1VERa_k_LQs/s1600/02.receive.png)](http://4.bp.blogspot.com/-hx4I28pk5po/Undxwe6iabI/AAAAAAAAA2A/1VERa_k_LQs/s1600/02.receive.png) 這裡以UDP為例 [![](http://2.bp.blogspot.com/-DyJoQXRgRBo/Undx0h2GzVI/AAAAAAAAA2I/1L9xaWi3D3Q/s1600/03.add.png)](http://2.bp.blogspot.com/-DyJoQXRgRBo/Undx0h2GzVI/AAAAAAAAA2I/1L9xaWi3D3Q/s1600/03.add.png) 設定要使用的Port號就行了 下方是log4net的設定範例 [![](http://3.bp.blogspot.com/-GkGKo0EWtOU/Undx4VhUDRI/AAAAAAAAA2Q/CBvil9xgUg4/s1600/04.udpport.png)](http://3.bp.blogspot.com/-GkGKo0EWtOU/Undx4VhUDRI/AAAAAAAAA2Q/CBvil9xgUg4/s1600/04.udpport.png) 以NLog來當日誌輸出元件的話,可以透過Chainsaw將Log寫到指定的位址和埠號 <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> &lt;!-- See http://nlog-project.org/wiki/Configuration_file for information on customizing logging rules and outputs. –> <targets> <target xsi:type="Chainsaw” name="viewer” address="tcp://127.0.0.1:7071” /> </targets> &lt;rules&gt; &lt;logger name="*" minlevel="Trace" writeTo="viewer" /&gt; &lt;/rules&gt; </nlog> 隨便輸出幾個Log試試 using NLog; namespace ConsoleApplication1 { class Program { private static Logger log = LogManager.GetLogger(“Program”); static void Main(string[] args) { log.


NLog API

LogManager LogManager是用來建立日誌和管理設定檔用的類別,有以下幾個Method LogManager.GetLogger - 取得或建立指定的logger 建議建立Logger的方式,需要手動指定名稱 LogManager.GetCurrentClassLogger - 取得或建立目前類別名稱的logger 雖然比較方便,但底層是以StackTrace取得名稱,成本高很多 LogManager.Configuration - 取得或設定目前日誌的設定資訊 LogManaget.GlobalThreshold - 取得或設定全域日誌的threshold Logger NLog.Logger類別是用來輸出Log用的,有以下幾個Method用來輸出不同層級的Log每個Method都有多個overloads用來最小化內存配置以提高日誌速度 Log() - 使用指定的格式和參數,將訊息寫入指定的級別 Trace() - 使用指定的格式和參數,將訊息寫入Trace級別 Debug() - 使用指定的格式和參數,將訊息寫入Debug級別 Info() - 使用指定的格式和參數,將訊息寫入Info級別 Warn() - 使用指定的格式和參數,將訊息寫入Warn級別 Erro() - 使用指定的格式和參數,將訊息寫入Error級別 Fatal() - 使用指定的格式和參數,將訊息寫入Fatal級別以下的方法和屬性用來檢查該層級的日誌是否啟用 IsEnabled() - 確定指定的級別日誌是否啟用 IsTraceEnabled - 確定Trace級別日誌是否啟用 IsDebugEnabled - 確定Debug級別日誌是否啟用 IsInfoEnabled - 確定Info級別日誌是否啟用 IsWarnEnabled - 確定Warn級別日誌是否啟用