Exceptionless 是一個開源的實時的日志收集框架,它將日志收集變得簡單易用並且不需要了解太多的相關技術細節及配置。本篇基於我的上一篇《基於Exceptionless實現分布式日志》,最近在公司內部搭建日志平台,且部署到了基於阿里雲的生產環境,因此做個記錄,也希望能幫助到希望基於Exceptionless來做日志平台的朋友們。
一、本地部署前置條件
這里主要參考Exceptionless的Self-Hosting Wiki文檔,下面是官方推薦的生產環境的前提條件:
- .NET 4.7
- IIS 7.5+
- PowerShell 3+
- Java JDK 1.8+
- ElasticSearch 5.6.
相信你會有兩個疑問:
(1)為何要用.NET 4.7和IIS?
因為Exceptionless的Web Dashboard是基於ASP.NET(基於.NET Framework)實現的,因此需要.NET 4.7(當然4.6.1也是支持的)和IIS(.NET Framework還沒有實現跨平台),因此最好是部署在Windows Server上面。因為我要部署的阿里雲服務器剛好是一台Windows Server 2016,因此也很方便地安裝了.NET 4.7和IIS 10。而PowerShell則是用來跑一個啟動相關服務(ElasticSearch + Kibna)的Windows下的PowerShell腳本的,因此可以做到開機啟動。
(2)ElasticSearch部署在哪里?
官方推薦ElasticSearch至少三個節點,且至少兩個節點部署在Linux系統上。對於數據量不大的內部業務微服務系統,可以直接在Windows Server中部署ElasticSearch,當然官方聲明ElasticSearch在Linux中的性能表現更好。而ElasticSearch是基於Java編寫的,因此也就需要安裝JDK(JRE)來作為運行時,當然你要先安裝一下JDK,並將其配置到環境變量中。
因此,基於業務量不大(目前只有一個內部業務系統和一個官方網站在用Exceptionless),我暫且將Web Dashboard和ElasticSearch都部署在Windows Server服務器中。
二、開始本地部署
2.1 下載Exceptionless本地部署包
Exceptionless雖然是一款開源日志平台框架,但是其也有收費版,且收費版支持多語言(包括中文),但是其開源本地部署版還是2017年9月的Release版本。我們要做的第一件事就是去下載Release包:v4.1.0
解壓這個zip包后的文件如下:
其中,Start.bat是一個快速安裝和啟動的批處理文件,它會幫我們調用兩個PowerShell腳本(Start-ElasticSearch及Start-WebSite),可以幫助我們安裝ElasticSearch + Kibna以及幫我們啟動一個IIS Express並部署好Web Dashboard項目。
2.2 安裝ElasticSearch
這里我將Start.bat修改為以下一句話,意為只安裝ElasticSearch,不讓其幫我啟動IIS Express來部署Web Dashboard項目。
>>PowerShell .\Start-Elasticsearch.ps1
然后編輯Start-ElasticSearch.ps1這個PowerShell腳本,將其Param部分修改為如下:
Param( [string]$Version = "5.5.2", [int]$NodeCount = 2, [bool]$StartKibana = $false, [int]$StartPort = 9200, [bool]$OpenKibana = $true, [bool]$ResetData = $false )
這里我選擇不啟動Kibana,以及將默認的ElasticSearch節點數從一個節點改為了兩個節點。
為了能夠正常執行PowerShell腳本,先以管理員權限執行一下下面這行命令:
>>Powershell Set-ExecutionPolicy Unrestricted
點擊Start.bat,開始調用Start-ElasticSearch進行ElasticSearch的安裝和啟動,等待一會兒,下載后的文件夾如下圖所示:
這時ElasticSearch已經在運行,並監聽了9200端口,請不要關閉命令行窗口,因為這時ElasticSearch不是在后台運行的。
當然,我們也可以通過docker來快速部署ElasticSearch到Linux上,例如可以通過以下這個docker-compose.yml文件來快速部署:
version: '3.4' services: elasticsearch: image: slideroom/elasticsearch:98 environment: bootstrap.memory_lock: 'true' discovery.type: single-node ES_JAVA_OPTS: '-Xms512m -Xmx512m' xpack.security.enabled: 'false' ports: - 9200:9200 - 9300:9300 ulimits: memlock: soft: -1 hard: -1 volumes: - esdata:/usr/share/elasticsearch/data kibana: depends_on: - elasticsearch image: slideroom/kibana:116 ports: - 5601:5601 volumes: esdata: driver: local appdata: driver: local
通過一句簡單的命令:docker-compose up -d 即可快速啟動ElasticSearch和Kibana。
2.3 部署Web控制台項目
由於我的環境是Windows Server 2016,因此啟動IIS,按照老習慣創建一個.NET應用程序池(v4.0)來附加wwwroot文件夾作為Web控制台,端口號默認設為50000。
現在開始進行配置文件的設置:
(1)app.config.xxxx.js
這里主要修改BASE_URL為你的服務器訪問IP地址:
(function () { 'use strict'; angular.module('app.config', []) .constant('BASE_URL', 'http://192.168.16.150:50000') .constant('EXCEPTIONLESS_API_KEY') .constant('FACEBOOK_APPID') .constant('GITHUB_APPID') .constant('GOOGLE_APPID') .constant('INTERCOM_APPID') .constant('LIVE_APPID') .constant('SLACK_APPID') .constant('STRIPE_PUBLISHABLE_KEY') .constant('SYSTEM_NOTIFICATION_MESSAGE') .constant('USE_HTML5_MODE', false) .constant('USE_SSL', false); }());
(2)Web.config
在Web.config中,需要配置如下的一些內容:
<connectionStrings> <!-- 如果開啟了Redis緩沖 --> <add name="RedisConnectionString" connectionString="192.168.16.151:6379,abortConnect=false" /> <!-- ElasticSearch的訪問地址 --> <add name="ElasticSearchConnectionString" connectionString="http://192.168.16.150:9200" /> <add name="LdapConnectionString" connectionString="" /> </connectionStrings>
當然,如果你已經在Linux中安裝了ES,那么直接修改Web.config的ElasticSearch的連接字符串即可。
其次,是appSettings中的一些基本信息:
<appSettings> <!-- Base url for the ui used to build links in emails and other places. --> <add key="BaseURL" value="http://192.168.16.150:50000/#" /> <!-- Controls whether SSL is required. Only enable this if you have SSL configured. --> <add key="EnableSSL" value="false" /> <!-- Dev: Use this mode when debugging. (Outbound emails will not be sent) QA: Use this mode when deployed to staging. (Outbound emails restricted) Production: Use this mode when deployed to production. --> <add key="WebsiteMode" value="Production" /> <!-- Controls whether users can signup. --> <add key="EnableAccountCreation" value="true" /> <!-- Controls whether daily summary emails are sent --> <add key="EnableDailySummary" value="true" /> ...... </appSettings>
這里主要是修改BaseURL(你要公布的Web端的訪問地址)和WebsiteMode(這里選擇Production,此模式下默認允許出站郵件發送)。
最后,是關於郵件的基本配置,以便能夠正常的發送郵件:
<add key="SmtpHost" value="smtp.exmail.qq.com" /> <add key="SmtpPort" value="465" /> <add key="SmtpEncryption" value="SSL" /> <add key="SmtpFrom" value="edisonchou@companyname.com" /> <add key="SmtpUser" value="edisonchou@companyname.com" /> <add key="SmtpPassword" value="your-password" />
*.這里記得一定要加上SmtpFrom,而且SmtpFrom需與SmtpUser保持一致。
其他幾個需要了解的設置,這里我使用默認配置,不更改其Value:
<!-- 異常數據-默認存儲在文件夾storage中 --> <add key="StorageFolder" value="|DataDirectory|\storage" /> <!-- 在當前Web網站進程中運行Jobs --> <add key="RunJobsInProcess" value="true" /> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> <!-- 保留日志天數 --> <add key="MaximumRetentionDays" value="90" /> <!-- 分片數量 --> <add key="ElasticSearchNumberOfShards" value="3" /> <!-- 復制分片數量 --> <add key="ElasticSearchNumberOfReplicas" value="1" />
三、將ElasticSearch設置為開機啟動項
由於Exceptionless依賴於ElasticSearch,因此需要將ES設為開機啟動或Windows服務。可以使用NSSM或直接將Start.bat加入計划任務,不再贅述。
四、配置ASP.NET Core客戶端
安裝Exceptionless的ASP.NET Core客戶端:
NuGet>>Install-Package Exceptionless.AspNetCore
*.目前最新版本為1.0.2
在StartUp啟動類中,分別注入封裝的Logger和使用Exceptionless中間件
public static class ExceptionlessBuilderExtensions { public static IApplicationBuilder UseExceptionless(this IApplicationBuilder app, IConfiguration configuration) { var isEnableLogger = Convert.ToBoolean(configuration["Exceptionless:Enabled"] ?? "false"); if (isEnableLogger) { // 封裝使用Exceptionless分布式日志組件 ExceptionlessClient.Default.Configuration.ApiKey = configuration["Exceptionless:ApiKey"]; ExceptionlessClient.Default.Configuration.ServerUrl = configuration["Exceptionless:ServerUrl"]; ExceptionlessClient.Default.SubmittingEvent += OnSubmittingEvent; app.UseExceptionless(); } return app; } private static void OnSubmittingEvent(object sender, EventSubmittingEventArgs e) { // 只處理未處理的異常 //if (!e.IsUnhandledError) //{ // return; //} // 忽略404錯誤 if (e.Event.IsNotFound()) { e.Cancel = true; return; } // 忽略沒有錯誤體的錯誤 var error = e.Event.GetError(); if (error == null) { return; } // 忽略 401 (Unauthorized) 和 請求驗證的錯誤. if (error.Code == "401" || error.Type == "System.Web.HttpRequestValidationException") { e.Cancel = true; return; } // Ignore any exceptions that were not thrown by our code. //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.Tags.Add("EDC.Core"); //e.Event.MarkAsCritical(); } }
其他配置和用法,請參考我的這一篇《基於Exceptionless實現分布式日志》來使用。
下面是配置好后的Web控制台:
如果需要獲得郵件通知及發送郵件到注冊用戶進行驗證:
如果要獲得每日的項目報告,請記得將Web.config中EnableDailySummary設為true。個人覺得郵件通知critical errors的功能很實用,再多的notification就是騷擾了。因此,我只勾選了一個critical errors。此外,要啟用郵件通知,請先通過注冊發送給你的email進行賬戶驗證(如下圖所示),否則無法啟用郵件通知。
Then, enjoy your bug exceptions :
五、一些其他注意事項
這里可以參考園友 花兒笑彎了腰 的這篇《Self Host 使用 Exceptionless 實時監控程序運行日志服務》,他講述了一些QA,也許會有你也遇到的坑:
參考資料
Exceptionless GitHub
Exceptionless Self-Host Document
Ants,《部署用於生產環境的Exceptionless》
uptothesky,《Exceptionless本地部署》
uptothesky,《Exceptionless郵箱配置》
akaxb,《Exceptionless本地部署小結》
依樂祝,《Exceptionless安裝配置及簡單實用》
花兒笑彎了腰,《Self Host 使用 Exceptionless 實時監控程序運行日志服務》