Log integrate to Slack

  • 445
  • 0
  • Log
  • 2016-05-22

Slack 協作平台越來越大眾化, 如果查詢 Log 這件事情是在 Slack 那該有多(潮)好 ?

讓你在真的發生重大錯誤的 Log 可以直接從 Slack 接收到

不用在使用 VPN 連去正式機把 Log 抓回來看

而且 Slack 又可以邀請同為工程師團隊的人進來一起看 Log 

是不是變得簡單又直覺呢 

Demo 其實提供了 2 篇很棒的 NLog 和 Elmah 整合到 Slack 教學文章

教學文章都是 2015 年了發佈的, 可見我著實慢了一年才知道

經過了這一年, 接 Slack API 的方式當然也是改變了

Token 的取得改為 Using OAuth 2.0 的方式去做交換

當然你也是可以照以前的步驟去按 Generate test tokens 按鈕, 然後你就得到了一個 Test token

官方有寫了關於使用 Test tokens 的警告

原則上是建議你使用 OAuth 2.0 的方式去取得 Token

這篇主要專注在如何透過它 API 進而在 Slack 上顯示

所以範例直接使用 Test Token 去呼叫

官方 Example 是使用 HTTP-GET 的方式傳輸

但因為 URL 會限制你傳輸的訊息量, 所幸官方還是有提供 POST 調用

廢話不多說

讓我們用 Web API 來舉例如何在發生錯誤時去把 Log 打去給 Slack

先做個繼承 ExceptionFilterAttribute 的 Filter

internal sealed class SlackAttribute: ExceptionFilterAttribute
{
   public override void OnException(HttpActionExecutedContext actionExecutedContext) {
      if (actionExecutedContext.Exception != null) {
         // progress Exception & call slack web api
      }

      base.OnException(actionExecutedContext);
   }
}

然後註冊在 App_Start 底下的 WebApiConfig.cs 中, 表示這 filter 層級是 Global

config.Filters.Add(new SlackAttribute());

剩下就是你自己定義錯誤訊息要顯示什麼在 Slack 上

在 SlackAttribute.cs 實作非常簡易 POST 到 Slack Web API 的語法

public override void OnException(HttpActionExecutedContext actionExecutedContext) {
   if (actionExecutedContext.Exception != null) {
      // progress Exception & call slack web api
      PostMessage("測試(中文) - 發生錯誤 !");
   }

   base.OnException(actionExecutedContext);
}

public static void PostMessage(string Message) {
   var settings = new Dictionary<string, string> {
      { "token", "YOUR TEST TOKEN" },
      { "channel", "YOUR CHANNEL" },
      { "username", "BOT'S NAME" },
      { "text", Message }
   };
   var param = string.Join("&", settings.Keys.Select(key => string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(settings[key]))));
   var query =Encoding.ASCII.GetBytes(param);

   var request = (HttpWebRequest)WebRequest.Create("https://slack.com/api/chat.postMessage");
   string result;
   request.Timeout = 15000;
   request.ContentType = "application/x-www-form-urlencoded";
   request.Method = "POST";
   request.ContentLength = query.Length;

   using (var requestStream = request.GetRequestStream()) {
      requestStream.Write(query, 0, query.Length);
   }

   using (var response = (HttpWebResponse)request.GetResponse()) {
      using (var responseStream = response.GetResponseStream()) {
         if (responseStream == null) {
            result = "";
         }
         using (var reader = new StreamReader(responseStream)) {
            result = reader.ReadToEnd();
         }
      }
   }
}

所以當有錯誤的時候就會收到一個你自訂的訊息 ( Log )

那自訂訊息就是交給團隊去定義要看什麼

前端 Log 打到 Slack 你就會收到滿滿的 Log 去 Trace 你前端有問題的情況  如下圖所示

目前工作專案有把前端 Log 發到工程師團隊的 Slack

好處是在客服還沒打來抱怨前就可以追蹤/解決問題了