前言
公司目前使用的專案中關於日誌記錄這塊,之前一直都是使用的Log4net 存放於後臺檔案中的,對於異常錯誤啊,或者需要檢視一些詳情錯誤的時候感覺很不方便,要到伺服器上去開啟日誌檔案檢索錯誤,降低了解決問題的速度,所以針對日誌這塊的優化就提上日程了。考慮了好久決定採用ExceptionLess日誌框架來處理和收集系統日誌。在實際操作中我也遇到了很多坑,現在將ExceptionLess分散式日誌框架在Windows上的本地化部署做個記錄。
一.安裝ExceptionLess
GitHub上有關於ExceptionLess的詳細介紹,我們的準備工作主要有以下幾點:
.net4.7
IIS 7.5+
由於本地環境和生成環境使用的都是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的一些其他強大的功能還等著我們去進一步挖掘和深入研究的.希望本文給其他的小夥伴一些幫助,歡迎大家來一起探討交流,我是程式猿貝塔.