ExceptionLess的安裝、配置、使用教程

前言

Exceptionless 是一個開源的實時的日志收集框架,它可以應用在基於 ASP.NET,ASP.NET Core,Web API,Web Forms,WPF,Console,ASP.NET MVC 等技術開發的應用程序中,並且提供瞭REST接口可以應用在 Javascript,Node.js 中。(基本就是.Net技術棧的一套東西)

項目地址:https://github.com/exceptionless/Exceptionless

它將日志收集變得簡單易用並且不需要瞭解太多的相關技術細節及配置,對於微服務架構的應用程序來說,統一的日志收集系統的建立更是有必要。

要使用的話隻需要在其官網上註冊個賬號,然後在代碼中配置一下APIKey就可以瞭,不過免費版額度有限,當然還是自己部署一套比較好,這次依然使用docker部署

安裝

docker部署可以在GitHub下載代碼自己構建,也可以用官方打包好的鏡像,為瞭方便這裡我直接使用官方打包的鏡像

docker-compose.yml 內容如下

可以看到其中包含5個容器:ExceptionLess App、ExceptionLess Job、elasticsearch、kibana、Redis

version: '3.7'

services:
  app:
    depends_on:
      - elasticsearch
      - redis
    image: exceptionless/app:latest
    environment:
      EX_AppMode: Production
      EX_ConnectionStrings__Cache: provider=redis
      EX_ConnectionStrings__Elasticsearch: server=http://elasticsearch:9200
      EX_ConnectionStrings__MessageBus: provider=redis
      #EX_ConnectionStrings__Metrics: provider=statsd;server=statsd;
      EX_ConnectionStrings__Queue: provider=redis
      EX_ConnectionStrings__Redis: server=redis,abortConnect=false
      EX_ConnectionStrings__Storage: provider=folder;path=/app/storage
      # 官方配置默認包含HTTPS,我把它關瞭
      #ASPNETCORE_URLS: http://+;https://+
      ASPNETCORE_URLS: http://+
      # 關瞭HTTPS,這個端口也不用配置瞭
      #ASPNETCORE_HTTPS_PORT: 5001
      # 關瞭HTTPS,證書也不用配置
      #ASPNETCORE_Kestrel__Certificates__Default__Password: password
      #ASPNETCORE_Kestrel__Certificates__Default__Path: /https/aspnetapp.pfx
      EX_RunJobsInProcess: 'false'
    ports:
      - 5000:80
      # 關瞭HTTPS,不需要映射443端口
      #- 5001:443
    volumes:
      - ex_appdata:/app/storage
      - ex_ssldata:/https

  jobs:
    depends_on:
      - app
    image: exceptionless/job:latest
    environment:
      EX_AppMode: Production
      # UI地址,修改這裡的IP地址為你的服務器IP地址
      EX_BaseURL: http://你的IP:5000
      EX_ConnectionStrings__Cache: provider=redis
      EX_ConnectionStrings__Elasticsearch: server=http://elasticsearch:9200
      # 郵件配置
      EX_ConnectionStrings__Email: smtps://郵箱地址:密碼@SMTP服務器:端口
      EX_SmtpFrom: 發件郵箱地址
      EX_ConnectionStrings__MessageBus: provider=redis
      #EX_ConnectionStrings__Metrics: provider=statsd;server=statsd;
      EX_ConnectionStrings__Queue: provider=redis
      EX_ConnectionStrings__Redis: server=redis,abortConnect=false
      EX_ConnectionStrings__Storage: provider=folder;path=/app/storage
    volumes:
      - ex_appdata:/app/storage

  elasticsearch:
    image: exceptionless/elasticsearch:7.15.2
    environment:
      discovery.type: single-node
      xpack.security.enabled: 'false'
      ES_JAVA_OPTS: -Xms1g -Xmx1g
    ports:
      - 9200:9200
      - 9300:9300
    volumes:
      - ex_esdata:/usr/share/elasticsearch/data

  kibana:
    depends_on:
      - elasticsearch
    image: docker.elastic.co/kibana/kibana:7.15.2
    ports:
      - 5601:5601

  redis:
    image: redis:6.0-alpine
    ports:
      - 6379:6379

volumes:
  ex_esdata:
    driver: local
  ex_appdata:
    driver: local
  ex_ssldata:
    driver: local

郵件配置

郵件配置是比較麻煩的地方,我查瞭一些資料才解決

jobs容器中的這兩個環境變量裡配置

EX_ConnectionStrings__Email: smtps://郵箱地址:密碼@SMTP服務器:端口
EX_SmtpFrom: 發件郵箱地址

有坑的地方就是EX_ConnectionStrings__Email變量的郵箱地址需要對@符號進行轉義,用%40代替@符號

以我的自建郵箱為例,郵箱地址是:[email protected],那麼配置就是這樣

EX_ConnectionStrings__Email: smtps://test%40dealiaxy.com:密碼@SMTP服務器:端口
EX_SmtpFrom: [email protected]

這樣配置完成就可以正常發郵件瞭~

PS:還可以配置Webhook實現報錯自動推送到微信、釘釘之類的平臺,不細說瞭

AspNetCore集成

我主要使用的.Net技術棧是AspNetCore,其他項目可以參考官方文檔的集成教程

首先在ExceptionLess中創建一個項目,把APIKey復制下來

編輯AspNetCore項目的appsettings.json文件,增加配置

"Exceptionless": {
    "ServerUrl": "http://12.0.0.1:5000",
    "ApiKey": "Rajo99MksQTS6zZK81238jTkNHNOQP33A3iW45JC"
}

然後編輯Program.cs,添加服務和中間件

builder.Services.AddExceptionless(builder.Configuration);
app.UseExceptionless();

集成這一步就搞定瞭

記錄事件

Exceptionless中的事件有以下幾種類型:

  • 日志消息:記錄的日志,可以是任何文本內容
  • 特性使用:功能使用量的記錄,例如接口調用情況等
  • 異常情況:記錄異常的信息
  • 失效鏈接:當被訪問的頁面不存在時進行記錄

除此之外,每個事件還可以附加tags、object、UserIdentity、Description之類的信息,有這些信息的輔助可以方便後續排查問題。

最簡單的使用

ExceptionlessClient.Default.CreateLog("message").Submit();

CreateLog方法會放回一個EventBuilder類型的對象,之後在這個對象上進行大部分操作支持鏈式調用

可以像上面那樣一行代碼鏈式調用,也可以這樣

// 先創建
var eventBuilder = ExceptionlessClient.Default.CreateLog("message");
// 再來慢慢添加
eventBuilder.AddObject(...);
eventBuilder.AddTags(...);
// 最後提交
eventBuilder.Submit();

可以附加到事件中的信息有很多,下面是官網提供的一些例子

// Set the reference id of the event so we can search for it later (reference:id).
// This will automatically be populated if you call ExceptionlessClient.Default.Configuration.UseReferenceIds();
.SetReferenceId(Guid.NewGuid().ToString("N"))
// Add the order object but exclude the credit number property.
.AddObject(order, "Order", excludedPropertyNames: new [] { "CreditCardNumber" }, maxDepth: 2)
// Set the quote number.
.SetProperty("Quote", 123)
// Add an order tag.
.AddTags("Order")
// Mark critical.
.MarkAsCritical()
// Set the coordinates of the end user.
.SetGeo(43.595089, -88.444602)
// Set the user id that is in our system and provide a friendly name.
.SetUserIdentity(user.Id, user.FullName)
// Set the users description of the error.
.SetUserDescription(user.EmailAddress, "I tried creating an order from my saved quote.")

例如,使用SetUserIdentity設置瞭用戶信息,在異常列表就可以看到用戶名,如圖

AddTags添加標簽,在頁面中以badge的形式顯示

還有AddObject,很方便,可以直接把對象傳進去,由於C#語言有匿名對象,那就更方便瞭,在頁面上的“擴展數據”標簽頁上可以看到,ExceptionLess會把對象處理成表格形式,更加直觀

提交錯誤信息

ExceptionLess提供瞭Exception對象的擴展方法

可以catch到錯誤後直接Submit

try {}
catch (Exception ex) {
    ex.ToExceptionless().Submit();
}

當然也可以附加一些信息進去

ex.ToExceptionless().AddObject(...).Submit();

集成日志框架

除瞭手動提交事件,它還提供瞭與現有日志框架集成的方法

安裝對應的nuget包就行(簡單搜瞭一下,至少對Log4net和NLog的支持應該是沒啥問題的)

以與Log4net集成為例,首先安裝nuget包:Exceptionless.Log4net

附上一個簡單的Log4net配置

<log4net>
<appender name="exceptionless" type="Exceptionless.Log4net.ExceptionlessAppender,Exceptionless.Log4net">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline"/>
  </layout>
</appender>

<root>
  <level value="DEBUG"/>
  <appender-ref ref="exceptionless"/>
</root>
</log4net>

其他語言能用嗎?

雖然官方隻支持.Net平臺和前端(js調用、vue3),不過ExceptionLess提供瞭大量的HTTP接口,想要在其他語言的項目中使用,隻需要調用對應的接口就行瞭,甚至可以自己封裝一個

不過在其他語言的項目中,我推薦使用Sentry(下一篇文章要介紹的),支持的語言/框架更多,ExceptionLess的優勢在於和AspNetCore這類.Net平臺的結合更好,結果頁面更直觀~

話說回來,ExceptionLess的接口文檔(Swagger)在/docs/index.html,根據部署地址訪問就能看到,裡面你要的功能基本都有。

參考資料

官方 Self Hosting Wiki:https://github.com/exceptionless/Exceptionless/wiki/Self-Hosting

.NET Core微服務之基於Exceptionless實現分佈式日志記錄:https://www.cnblogs.com/edisonchou/p/exceptionless_foundation_and_quick_start.html

開源日志框架Exceptionless使用教程:https://www.cnblogs.com/youring2/p/11546485.html

Exceptionless 5.x 無法正常發送郵件的問題解決 :https://www.cnblogs.com/edisonchou/p/solve_the_problem_of_exceptionless_on_cannot_send_emails.html

到此這篇關於ExceptionLess的安裝、配置、使用教程的文章就介紹到這瞭,更多相關ExceptionLess安裝使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: