使用 Exceptionless 取代 ELK(Elasticsearch, Logstash, Kibana) 中的 kibana 來完成 log 集中化

目前公司的 application logs 集中化是用 ELK(Elasticsearch, Logstash, Kibana) 來處理的,而前公司則使用付費軟體 Splunk 來做,兩者差別最明顯的就是 ELK 是 open source 軟體 ;Splunk 是商業軟體,功能設定的操作上是比較簡易的; 那為什麼有了 ELK 還需要 Exceptionless 呢? 主因是 kibana 在權限管理的套件需要額外付費,不包含在 open source 的範圍,加上 Exceptionless 是 .Net 開發的,對於微軟派開發人員是比較容易修改及客製的,因此為了可以在 user interface 這層具備基本權限功能打算使用 Exceptionless 來取代。

在 2016 年時曾經推薦給同事使用,但後來同事未採納:原因是在看了官網 Exceptionless 官網 介紹後認為是雲端服務,免費使用量只保留三天內的事件、一個月還只能存 3000 筆紀錄;事實上 Exceptionless 是 open source 的軟體,如果不想自己架的話可以考慮他們的雲端服務,而我們則是想用採取 self host 的作法,相關文件可以參考 Exceptionless Self Hosting

2016 年時我也曾經嘗試自行架設過測試環境,雖然有成功架起來,但當時 Exceptionless 3.x 僅支援 Elasticsearch 1.7 版本,由於公司已使用 Elasticsearch 3.x 實際助益不大,直到 2017-01 的 Exceptionless 4 才一下跳躍式支援到 Elasticsearch 5

基本需求

Exceptionless Self Hosting 針對不同的環境有不同的要求,以下文章內容將使用測試環境展示

  1. 測試環境

    • .NET 4.6.1
    • Java JDK 1.8+
    • IIS Express 8+
    • PowerShell 3+

    注意:測試環境的設定僅限測試用,不應該用在正式環境上

  2. 正式環境

    • .NET 4.6.1
    • IIS 7.5+
    • ElasticSearch 5.1

如何安裝

  1. github 下載 Exceptionless zip
  2. 解壓縮 Exceptionless.zip
  3. 確定 PowerShell 有執行權限
    • 以 administrator 開啟 command promt
    • 輸入 powershell Set-ExecutionPolicy Unrestricted 並執行
  4. double click start.bat 進行安裝

    1start

    • 會使用 powershell 下載並安裝 elasticsearch (預設使用 9200 port)

      2downloadelastic

      3startelastic

    • 接著下載並安裝 kibana server (預設使用 5601 port)

      4downloadkibana

      5startkibana

    • 啟動 iis express (預設使用 50000 port)

      6startwebsite

      7startwebsite

相關設定

  1. 首次登入需註冊使用者

    8singup

  2. 設定專案資訊

    9setupproject

  3. 選擇專案類型

    9projectype

  4. 會提供如何使用的說明及 api key

    10howtouse

如何使用 (以 ASP.NET MVC 為例)

  1. 安裝 Exceptionless.Mvc 套件(擇一即可)

    • 使用 NuGet Manager GUI

      • 搜尋 Exceptionless.Mvc.Signed

        11nugetinstall

    • 使用 NuGet console

      Install-Package Exceptionless.Mvc 
      
  2. 在 web.config 加入 apiKey 及 url

    <exceptionless apiKey="API_KEY_HERE" serverUrl="http://localhost:50000"/>
    
  3. 手動拋出錯誤

    ex.ToExceptionless().Submit()
    
  4. 其他送出事件的方式可以參考 Sending Events

    個人偏好的方式是使用 nlog or log4net,就可以不用增加寫 log 的程式碼直接多個 log target 把 log 傳至 elasticsearch 去

    • 以 nlog 為例

      • 安裝 Exceptionless.NLog
      • 在 nlog 的 config 加上 exceptionless extension

        <extensions>
            <add assembly="Exceptionless.NLog"/>  
        </extensions>
        
      • 在 nlog 的 config 加上 exceptionless 的 target 設定

        <target name="exceptionless" apiKey="API_KEY_HERE" serverUrl="http://localhost:50000" xsi:type="Exceptionless">
            <field name="host" layout="${machinename}"/>
            <field name="identity" layout="${identity}" />
            <field name="windows-identity" layout="${windows-identity:userName=True:domain=False}" />
            <field name="process" layout="${processname}" />
        </target>
        
      • 在 nlog 的 config 加上 exceptionless 的 rules 設定

        <logger name="*" minlevel="Trace" writeTo="exceptionless" />
        
      • 程式使用方式

        private Logger logger = LogManager.GetCurrentClassLogger();
        logger.Debug("test123");
        
      • 實際效果

        12result

心得

舊版 Exceptionless 設定的工很多又很容易出錯,現在的版本難度降低非常多,可以再深入試試看

參考資料

  1. Exceptionless 官網
  2. Exceptionless Self Hosting
  3. Sending Events