前言
從去年就答應過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團隊給我們提供了一個更好的框架來做這件事情,我認為這是非常偉大并且有意義的,感謝他們。
就讓我們一起來看看吧。
GitHub:https://github.com/exceptionless/Exceptionless
Getting Started
一、首先,需要去官網注冊一個帳號(打不開的同學你懂的),注冊完成之后登錄系統。
ps :Exceptionless 的系統也可以部署到本地服務器哦
二、按照提示,添加一個你的項目:
然后可以看到一個下拉菜單,選擇項目的類型,可以看到 Exceptionless支持很多種項目。我們來選擇一個 ASP.NET Core 的項目:
三、選擇完成之后,會有一個詳細的步驟,說明了如何做項目中使用。
- 首先,使用 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 主面板中,可以看到關于整個項目的一個異常情況,并且分別以幾種方式列了出來,其中包括分布圖,最頻繁的異常,最近的異常等等。
這個我們剛才在Abount Action中制造的一個異常,Exceptionless已經記錄了下來,點進去之后可以看一下詳情:
在上圖中,可以很直觀的看出異常的一些具體信息,除了一些基本的異常類型、時間和堆棧外,還包括訪問者的坐標、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。
本文地址:http://www.cnblogs.com/savorboard/p/exceptionless.html
作者博客:Savorboard
歡迎轉載,請在明顯位置給出出處及鏈接
文章列表
不含病毒。www.avast.com |
留言列表