.Net Core 整合ExceptionLess分散式日誌框架之本地化部署

程式猿貝塔發表於2020-06-30

前言

公司目前使用的專案中關於日誌記錄這塊,之前一直都是使用的Log4net 存放於後臺檔案中的,對於異常錯誤啊,或者需要檢視一些詳情錯誤的時候感覺很不方便,要到伺服器上去開啟日誌檔案檢索錯誤,降低了解決問題的速度,所以針對日誌這塊的優化就提上日程了。考慮了好久決定採用ExceptionLess日誌框架來處理和收集系統日誌。在實際操作中我也遇到了很多坑,現在將ExceptionLess分散式日誌框架在Windows上的本地化部署做個記錄。

一.安裝ExceptionLess

GitHub上有關於ExceptionLess的詳細介紹,我們的準備工作主要有以下幾點:

.net4.7

IIS 7.5+

PowerShell 3+

Java JDK 1.8+

由於本地環境和生成環境使用的都是Windows,所以針對Exceptionless的部署就重點在如何部署在Windows上的問題了,網上也有很多相關文件是直接部署在Linux的,但這不是我們本文的重點。

關於Java環境的配置可以參考下面文章Java安裝與環境配置文章寫的很詳細,跟著配置下來是不會有太大問題的。

接著,我們來下載ExceptionLess的最新版本,GitHub上最新的版本是ExceptionLess4.1.2861

下載完後解壓檔案,可以看到如下幾個檔案

其中Start.bat用於快速啟動的批處理檔案,其實就是執行ElasticSearch和WebSite.ps1這兩個檔案,它會幫我們安裝執行ElasticSearch和Kibana.

在這一步安裝的過程中問題最多,也是最難解決的,真的是折騰了好久。

1.Q:執行Start.bat 顯示 請求被中止:未能建立SSL/TLS安全通道.

A:在ElasticSearch.ps1檔案中,命令執行前加上如下一行命令:

2.緊接著,再次啟動Start.bat,可以看到終於正常下載並寫入web流了,這個過程好像也很漫長,我記得當時晚上走的時候電腦沒關,就一直讓它下載了。這個好像也和本身自己的網路有關係。

等待下載中,剛剛的檔案裡就會多了幾個資料夾.

ExceptionLess預設的埠是50000,如果執行正常,在瀏覽器裡輸入localhost:50000,會顯示登入頁面,

但是我第一次顯示的卻是個an error occurred trying to red the response from the specified node.

查閱相關資料後,得知是每次訪問時,需要先 啟動ElasticSearch服務,這裡,我直接將ElasticSearch服務註冊到了Windows上,每次開機自動啟動該服務,省去了每次執行Start.bat 然後一次開啟4個dos視窗的麻煩。

ElasticSearch註冊服務,在node1的bin目錄下執行cmd開啟命令視窗

執行elasticsearch-sevice.bat install 去安裝服務. 執行elsticsearch-service.bat start 去開啟服務

後續我們直接在服務裡將該服務的啟動方式設為自動,即可完成註冊.

接著我們將ExceptionLess部署到IIS上,新建一個網站,目錄為wwwroot.埠號預設為50000,如果你需要修改埠號,

記得在app.config.xxxx.js 修改BASE_URL ;

在 web.config 的修改埠號.

Start-Website.ps1檔案的最後兩行的埠號,也需要修改.

經過這一番折騰,我們終於可以訪問本地的Exceptionless了。

二.ExceptionLess在.net Core 專案下的配置

由於我們使用的專案環境為.net core ,所以我們在Exceptionless裡新建一個組織,名稱隨便,接著新建一個專案,專案框架選擇 Exceptionless.AspNetCore

使用的方法也很簡單,直接在專案的startup.cs 裡使用 app.UseExceptionless(“XXXXXAPI金鑰”).

這裡,我將ExceptionLess的一些配置放在了appsettings.json裡於是我們在startup.cs裡可以這樣寫

  var isEnableLogger = Convert.ToBoolean(_appConfiguration["Exceptionless:Enabled"] ?? "false");
        if (isEnableLogger)
        {
            // 封裝使用Exceptionless分散式日誌元件
            ExceptionlessClient.Default.Configuration.ApiKey = _appConfiguration["Exceptionless:ApiKey"];
            ExceptionlessClient.Default.Configuration.ServerUrl = _appConfiguration["Exceptionless:ServerUrl"];
            app.UseExceptionless();
        }

接著我們可以嘗試手動拋一個異常出來,看看ExceptionLess是否能捕獲到.

   public ActionResult<IEnumerable<string>> Get()
        {
            throw new Exception($"看這裡異常了!時間:{DateTime.Now}");
            return new string[] { "value1", "value2" };
        }

可以看到我們的ExceptionLess成功捕獲到了異常,當然我們也可以手動提交一個異常資訊到ExceptionLess上去,具體的寫法就是:

   // GET api/values/5
        [HttpGet("{id}")]
        public ActionResult<string> Get(int id)
        {
            try
            {

                throw new Exception("異常");
                return "value";
            }
            catch (Exception ex)
            {
                ex.ToExceptionless().Submit();
            }
            return "value";
        }

當然,這些例子都很簡單,其實最重要的就是Exceptionless的安裝過程,實在是遇到了很多讓人頭大的問題,不過好在這些問題最後都解決了。

目前ExceptionLess日誌框架只在本地的測試環境裡安裝部署了,網上有小夥伴說到的生成環境下的時區問題,由於暫時還沒部署到生成環境,這個問題也就暫時還沒遇到,等真正遇到的時候再來詳細研究如何解決處理吧。

三.結束語

參考文獻:

本文在編輯過程中參考以下文章的部分內容和資料,在此表示感謝。

依樂祝,《Exceptionless安裝配置及簡單實用

markjiang7m2 ,《Exceptionless - .Net Core開源日誌框架

markjiang7m2 ,《Exceptionless(二) - 本地部署使用進階

Java環境變數配置《Java環境變數配置

再次對以上作者表示感謝.

對於Exceptionless的使用,我也是僅僅開始入門,ExceptionLess的一些其他強大的功能還等著我們去進一步挖掘和深入研究的.希望本文給其他的小夥伴一些幫助,歡迎大家來一起探討交流,我是程式猿貝塔.

相關文章