ログを簡単にSlackに流して快適cronライフ

  • 1
    いいね
  • 0
    コメント

はじめに :beginner:

この記事は、SLP KBIT Advent Calender2016 その2の17日目の記事になります。

今回は、cronで実行した処理の結果をSlackに流すという題材で記事を書きました。
例はRubyで書かれていますが、POSTが可能な言語ならなんでも大丈夫です。

横道 :feet:

内田真礼さんの2ndライブが2017年2月26日(日)に開催決定しました :bangbang:
とてもめでたい :congratulations:

ところでその日は卒論&修論の前の日です :innocent:
クソが!!

閑話休題

ことのはじめ

これをやろうと思ったきっかけについて

私は研究で1日1回、cronを使いスクレイピングでデータをとってきたり、
その情報から様々なデータを作成・登録したりしています。

その際、今まで何度かページのDOM構造が変わっていたり、
コードに不備があったりして、処理が正常に実行されずエラーが起きることがありました。

しかし、毎日ログを見に行けるわけではないので、
エラーを見逃して処理が止まっていることがたびたびありました。

そのため、普段見るチャットツールであるslackにlogを毎日流そうと思ったわけです!!

※ slackってなに?
https://seleck.cc/406

Slack 準備編

1. 情報を流したいSlackのチーム名を選び、Apps&integrationsをクリック

image

2. incoming WebHooksを加える

以下のような画面にとぶと思うので、Incoming WebHooksを選択

image

Add Comfigurationをクリック

image

3. post先やBotのアカウントの情報の変更

image

準備完了 :thumbsup:

あとは上記の画像の隠されてる部分にあるURLにPOSTを送るだけです。

実践編

実装は基本的には、以下の2つのパターンになると思う。
1. 例外処理でエラーを受け取って送る
2. ログファイルから読み出した情報を送る

必要なgem

require 'net/http'
require 'uri'
require 'json'

例外処理パターン

cron処理の数が少ない場合、cron処理のエラーが出る可能性ある箇所に、
例外処理を入れていけばいい。

request_url = "https://hoks.slack.com/services/????"
uri = URI.parse(request_url)
begin
  # 処理
rescue => e
  data = { text: e.message }
  res = Net::HTTP.post_form(uri, { payload: data.to_json })
end

ログファイルの情報を利用

cron処理にWheneverというgemを使っているのでそれを例にしています。
schedule.rbがcronのタスクを管理するファイルです。
タスクを記述している部分の最後にSlackに流す処理を書いたタスクを記述します。
(今回は例としてrakeタスクを用意)

set :output, {:error => 'log/error.log', :standard => 'log/cron.log'}
の部分で、cronタスクが成功した場合は

schedule.rb
require File.expand_path(File.dirname(__FILE__) + "/environment")

set :output, {:error => 'log/error.log', :standard => 'log/cron.log'}
set :environment, "development"
every 1.days, at: '1:00 am' do
  #cronタスク...

  # 最後にslackに流すタスク(サンプル)
  rake 'slack:cron_log'
end

ログファイルの情報をSlackに流す処理の例
rakeタスクの一部抜粋

slack.rake
    request_url = "https://hooks.slack.com/services/????"
    uri = URI.parse(request_url)


    # logファイルの情報を抽出
    log = ''
    File.open('./log/error.log', 'r') do |file|
      log = file.read
      log = '成功!!' if log == ""
    end

    data = { text: log }
    res = Net::HTTP.post_form(uri, { payload: data.to_json })

    # logファイルの中身を削除
    File.open('./log/error.log', 'w') do |file|
      file = nil
    end

試してみた

正常とエラーの場合をそれぞれ試してみた。(エラーは長いので一部省略)

  • 正常に終了した場合
    image
  • エラーがでた場合 image

なにか足りない

幸せ :heart_eyes:

image

おわりに

ということで今回は、cronのログをSlackに流してみたのを紹介しました。
これで、皆さんも快適なcronライフを!!

できるだけ簡単にできる方法を選んだつもりですが、「この方がもっといいよ」みたいなのあったら教えて欲しいです。