1. 程式人生 > >免費開源分散式系統日誌收集框架 Exceptionless

免費開源分散式系統日誌收集框架 Exceptionless

前言

從去年就答應過Eric(Exceptionless的作者之一),在中國會幫助給 Exceptionless 做推廣,但是由於各種原因一直沒有做這件事情,在此對Eric表示歉意。:)

Exceptionless 簡介

Exceptionless 是一個開源的實時的日誌收集框架,它可以應用在基於 ASP.NET,ASP.NET Core,Web Api,Web Forms,WPF,Console,MVC 等技術棧的應用程式中,並且提供了Rest介面可以應用在 Javascript,Node.js 中。它將日誌收集變得簡單易用並且不需要了解太多的相關技術細節及配置。

在以前,我們做日誌收集大多使用 Log4net,Nlog 等框架,在應用程式變得複雜並且叢集的時候,可能傳統的方式已經不是很好的適用了,因為收集各個日誌並且分析他們將變得麻煩而且浪費時間。

現在Exceptionless團隊給我們提供了一個更好的框架來做這件事情,我認為這是非常偉大並且有意義的,感謝他們。

就讓我們一起來看看吧。

Getting Started

一、首先,需要去官網註冊一個帳號(打不開的同學你懂的),註冊完成之後登入系統。

ps :Exceptionless 的系統也可以部署到本地伺服器哦

image

二、按照提示,新增一個你的專案:

image

然後可以看到一個下拉選單,選擇專案的型別,可以看到 Exceptionless支援很多種專案。我們來選擇一個 ASP.NET Core 的專案:

image

三、選擇完成之後,會有一個詳細的步驟,說明了如何做專案中使用。
image

  • 首先,使用 NuGet 新增一個包,名字叫Exceptionless.AspNetCore
  • 在 ASP.NET Core 專案中,開啟startup.cs檔案,找到Configure()方法,新增如下:
using Exceptionless;
......

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // xxxxx 處填寫上圖畫紅線部分的key
    app.UseExceptionless("xxxxxxxxxxxxxxxxxxxxxxxxxx");

    app.UseStaticFiles();

    app.UseMvc();
}

至此,Exceptionless 已經可以在你的專案中工作了,它會自動記錄專案中的異常情況。

在 Exceptionless 檢視日誌

在 Getting Started 步驟,我們建立了一個 ASP.NET Core 專案,下面我們來執行一下,看看它是怎麼工作的吧。

開啟 HomeController.cs檔案,修改About的action方法,人為的製造一個異常資訊:

public IActionResult About() {

    throw new Exception("test exception");
   
    return View();
}

接下來,重新整理 Exceptionless的頁面,在 Dashboard 主面板中,可以看到關於整個專案的一個異常情況,並且分別以幾種方式列了出來,其中包括分佈圖,最頻繁的異常,最近的異常等等。

image

這個我們剛才在Abount Action中製造的一個異常,Exceptionless已經記錄了下來,點進去之後可以看一下詳情:

image
image
image
image

在上圖中,可以很直觀的看出異常的一些具體資訊,除了一些基本的異常型別、時間和堆疊外,還包括訪問者的座標、IP地址、發生異常的URL地址、瀏覽器資訊,作業系統、甚至發生異常時請求的Cookie值。

向 Exceptionless 傳送事件

除了我們所熟悉的異常資訊外,Exceptionless 還可以記錄很多種類的其他資訊,這些資訊統稱做事件(Event)。

在Exceptionless 中,有這幾類事件: Log (日誌)、Feature Usages(功能用途)、404、Custom Event(自定義事件)。

Exceptionless 中傳送不同型別事件很簡單,程式碼如下:

using Exceptionless;

// 傳送日誌
ExceptionlessClient.Default.SubmitLog("Logging made easy");

// 你可以指定日誌來源,和日誌級別。
// 日誌級別有這幾種: Trace, Debug, Info, Warn, Error
ExceptionlessClient.Default.SubmitLog(typeof(Program).FullName, "This is so easy", "Info");
ExceptionlessClient.Default.CreateLog(typeof(Program).FullName, "This is so easy", "Info").AddTags("Exceptionless").Submit();

// 傳送 Feature Usages
ExceptionlessClient.Default.SubmitFeatureUsage("MyFeature");
ExceptionlessClient.Default.CreateFeatureUsage("MyFeature").AddTags("Exceptionless").Submit();

// 傳送一個 404
ExceptionlessClient.Default.SubmitNotFound("/somepage");
ExceptionlessClient.Default.CreateNotFound("/somepage").AddTags("Exceptionless").Submit();

// 發生一個自定義事件
ExceptionlessClient.Default.SubmitEvent(new Event { Message = "Low Fuel", Type = "racecar", Source = "Fuel System" });

手動傳送一個已處理的異常

有時候,我們在程式程式碼中顯式的處理一些異常,這個時候可以手動的來將一些異常資訊傳送到Exceptionless。

try 
{
    throw new ApplicationException(Guid.NewGuid().ToString());
} 
catch (Exception ex)
{
    ex.ToExceptionless().Submit();
}

為傳送的事件新增額外的標記

在傳送一個事件的時候,可以為當前事件新增額外的上下文資訊進行傳送,如果新增座標、標籤、屬性等等。

try 
{
    throw new ApplicationException("Unable to create order from quote.");
} 
catch (Exception ex) 
{
    ex.ToExceptionless()
        // 為事件設定一個編號,以便於你搜索 
        .SetReferenceId(Guid.NewGuid().ToString("N"))
        // 新增一個不包含CreditCardNumber屬性的物件資訊
        .AddObject(order, "Order", excludedPropertyNames: new [] { "CreditCardNumber" }, maxDepth: 2)
        // 設定一個名為"Quote"的編號
        .SetProperty("Quote", 123)
        // 新增一個名為“Order”的標籤
        .AddTags("Order")
        // 標記為關鍵異常
        .MarkAsCritical()
        // 設定一個地理位置座標
        .SetGeo(43.595089, -88.444602)
        // 設定觸發異常的使用者資訊
        .SetUserIdentity(user.Id, user.FullName)
        // 設定觸發使用者的一些描述
        .SetUserDescription(user.EmailAddress, "I tried creating an order from my saved quote.")
        // 傳送事件
        .Submit();
}

統一處理髮送的事件

你可以預設的為ExceptionlessClient.Default.SubmittingEvent繫結額外的事件,來統一自定義一些處理。

ExceptionlessClient.Default.SubmittingEvent += OnSubmittingEvent;

private void OnSubmittingEvent(object sender, EventSubmittingEventArgs e) {
    // 僅處理未被處理過的異常
    if (!e.IsUnhandledError)
        return;

    // 忽略404事件
    if (e.Event.IsNotFound()) {
        e.Cancel = true;
        return;
    }

    // 獲取error物件
    var error = e.Event.GetError();
    if (error == null)
        return;

    // 忽略 401 或 `HttpRequestValidationException`異常
    if (error.Code == "401" || error.Type == "System.Web.HttpRequestValidationException") {
        e.Cancel = true;
        return;
    }

    // 忽略不是指定名稱空間程式碼丟擲的異常
    var handledNamespaces = new List<string> { "Exceptionless" };
    if (!error.StackTrace.Select(s => s.DeclaringNamespace).Distinct().Any(ns => handledNamespaces.Any(ns.Contains))) {
        e.Cancel = true;
        return;
    }

    e.Event.AddObject(order, "Order", excludedPropertyNames: new [] { "CreditCardNumber" }, maxDepth: 2);
    e.Event.Tags.Add("Order");
    e.Event.MarkAsCritical();
    e.Event.SetUserIdentity(user.EmailAddress);
}

配合使用 NLog 或 Log4Net

有時候,程式中需要對日誌資訊做非常詳細的記錄,比如在開發階段。這個時候可以配合 log4net 或者 nlog 來聯合使用 exceptionless,詳細可以檢視這個 示例

如果你的程式中有在短時間內生成大量日誌的情況,比如一分鐘產生上千的日誌。這個時候你需要使用記憶體儲存(in-memory store)事件,這樣客戶端就不會將事件系列化的磁碟,所以會快很多。這樣就可以使用Log4net 或者 Nlog來將一些事件儲存到磁碟,另外 Exceptionless 事件儲存到記憶體當中。

using Exceptionless;
ExceptionlessClient.Default.Configuration.UseInMemoryStorage();

總結

本篇主要是對 Exceptionless 做了一個介紹,然後介紹了 Exceptionless 是怎麼傳送日誌的。
因為目前 Exceptionless 的站點在國外,並且站點裡面呼叫了一些 google 的 api,所以可能在中國訪問起來有點麻煩,大家可以先科學上網體驗一下功能。畢竟 Exceptionless 是開源免費的並且服務端也是可以本地部署的。

如果您覺得本文對您有幫助,想讓更多人瞭解Exceptionless,感謝您幫忙點的【推薦】。

如果您對 Exceptionless 感興趣或者是想學習 Exceptionless 的程式碼,可以加入群。

Exceptionless QQ群:330316486

相關推薦

免費開源分散式系統日誌收集框架 Exceptionless

前言 從去年就答應過Eric(Exceptionless的作者之一),在中國會幫助給 Exceptionless 做推廣,但是由於各種原因一直沒有做這件事情,在此對Eric表示歉意。:) Exceptionless 簡介 Exceptionless 是一個開源的實時的日誌收集框架,它可以應用在基於 ASP.N

asp.Net Core免費開源分布式異常日誌收集框架Exceptionless安裝配置以及簡單使用圖文教程

true 類型 全部 界面 目錄 () 程序包 light set 最近在學習張善友老師的NanoFabric 框架的時了解到Exceptionless : https://exceptionless.com/ !因此學習了一下這個開源框架!下面對Exceptionless

分散式系統日誌收集ELK

1.ELK介紹 ElK,即ElasticSearch+Logstash+Kibana ElasticSearch是一個基於Lucene的開源分散式搜尋伺服器。它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。它提供了一個分散

分散式日誌收集框架flume實戰

實戰一:從指定網路埠採集資料輸出到控制檯 flume框架架構 Source:指定資料來源,有NetCat TCP(專案用到),kafka,JMS,Avro,Syslog等等 Channel:資料管道,有Kafka,Memory,File等等 Sink:日誌資料存放,有Avro,HBa

分散式日誌收集框架Flume

文章目錄 Flume概述 Flume架構及核心元件 Flume&JDK環境部署 Flume實戰案例一 Flume實戰案例二 Flume實戰案例三(重點掌握) 業務現狀:公司有Hadoop

分散式日誌收集框架Flume環境部署

最近在做一個基於Spark Streaming的實時流處理專案,之間用到了Flume來收集日誌資訊,所以在這裡總結一下Flume的用法及原理. Flume是一個分散式、高可靠、高可用、負載均衡的進行大量

分散式日誌收集框架Flume:從指定網埠採集資料輸出到控制檯

A)配置Source B)配置Channel C)配置Sink D)把以上三個元件串起來 變數: a1:agent名稱r1:source的名稱k1:sink的名稱c1:channel的名稱 #以下為配

在.NET Core中使用Exceptionless分布式日誌收集框架

ESS 並且 有意義 ole 日誌記錄 eat 管理 bubuko cti 一.Exceptionless簡介   Exceptionless 是一個開源的實時的日誌收集框架,它可以應用在基於 ASP.NET,ASP.NET Core,Web Api,Web Forms,

大資料-Flume(分散式日誌收集框架

這裡主要是三個常見的需求:監聽埠收集資料監聽檔案收集資料監聽檔案資料轉向其他機器Flume安裝前置條件    Java Runtime Environment - Java 1.7 or later    Memory - Sufficient memory for conf

分散式日誌收集框架 Flume

1 需求分析 WebServer/ApplicationServer分散在各個機器上,然而我們依舊想在Hadoop平臺上進行統計

日誌收集框架 Flume 組件之Source使用

exp component imm 更新 作用 多少 收集 under onf 上一篇簡單介紹了Flume幾個組件,今天介紹下組件其一的source,整理這些,也是二次學習的過程,也是梳理知識的過程。 Source 中文譯為來源,源作用:采集數據,然後把數據傳輸到chann

ELK 實現 Java 分散式系統日誌分析架構

ELK 實現 Java 分散式系統日誌分析架構 日誌是分析線上問題的重要手段,通常我們會把日誌輸出到控制檯或者本地檔案中,排查問題時通過根據關鍵字搜尋本地日誌,但越來越多的公司,專案開發中採用分散式的架構,日誌會記錄到多個伺服器或者檔案中,分析問題時可能需要檢視多個日誌檔案才能定位問題,如果相關

分散式系統詳解--框架(Hadoop-叢集搭建)

                 分散式系統詳解--框架(Hadoop-叢集搭建)        前面的文章也簡單介紹了,hadoop的環境搭建分為三種,單機版,偽分

分散式系統詳解--框架(Hadoop-單機版搭建)

                    分散式系統詳解--框架(Hadoop-單機版搭建)        前面講了這麼多的理論知識,也有一些基礎的小知識點,

分散式系統詳解--框架(Hadoop--RPC協議)

                   分散式系統詳解--框架(Hadoop--RPC協議)        在之前的一篇文章當中已經寫過一篇文章是關於RPC通

分散式系統詳解--框架(Hadoop--JAVA操作HDFS檔案)

       分散式系統詳解--框架(Hadoop--JAVA操作HDFS檔案)         前面的文章介紹了怎麼將整個集群系統搭建起來,並進行了有效的測試。為了解決登入一臺伺服器登入其他伺服器需要多次輸入密碼的

分散式系統詳解--框架(Hadoop-基本shell命令)

               分散式系統詳解--框架(Hadoop-基本shell命令)         前面的文章我們已經將一個叢集搭建好了,現在就需要知道一些關於hadoo

分散式系統詳解--框架(Hadoop-Ssh免密登陸配置)

              分散式系統詳解--框架(Hadoop-Ssh免密登陸配置)          配置Ssh非常簡單,其實就是為了避免將來叢集機器變得很多導致操作本機、

分散式系統詳解--框架(Zookeeper-簡介和叢集搭建)

             分散式系統詳解--框架(Zookeeper-簡介和叢集搭建) 一、Zookeeper簡介 1.1 Zookeeper是什麼?        

分散式系統詳解--框架(Hadoop-HDFS的HA搭建及測試)

              分散式系統詳解 - 框架(Hadoop的HDFS的HA搭建及測試) 一,背景概述 解決問題1:通過上面的圖我們可以明確的看出來,如果的Namenode壞掉了,那我們的整個叢集可以說就是要癱瘓了也就是單節點故障問題。 於是現在就出現了另外一