1. 程式人生 > 實用技巧 >分散式日誌框架Exceptionless之生產環境部署步驟

分散式日誌框架Exceptionless之生產環境部署步驟

Exceptionless 是一個開源的實時的日誌收集框架,它將日誌收集變得簡單易用並且不需要了解太多的相關技術細節及配置。本篇基於我的上一篇《基於Exceptionless實現分散式日誌》,最近在公司內部搭建日誌平臺,且部署到了基於阿里雲的生產環境,因此做個記錄,也希望能幫助到希望基於Exceptionless來做日誌平臺的朋友們。

一、本地部署前置條件

  這裡主要參考Exceptionless的Self-Hosting Wiki文件,下面是官方推薦的生產環境的前提條件:

  相信你會有兩個疑問:

  (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指令碼,先以管理員許可權執行一下下面這行命令:

>>PowershellSet-ExecutionPolicy Unrestricted

  點選Start.bat,開始呼叫Start-ElasticSearch進行ElasticSearch的安裝和啟動,等待一會兒,下載後的資料夾如下圖所示:

  這時ElasticSearch已經在執行,並監聽了9200埠,請不要關閉命令列視窗,因為這時ElasticSearch不是在後臺執行的。

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="[email protected]" />
    <add key="SmtpUser" value="[email protected]" />
    <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,也許會有你也遇到的坑: