はじめに
この記事は、SLP KBIT Advent Calender2016 その2の17日目の記事になります。
今回は、cronで実行した処理の結果をSlackに流すという題材で記事を書きました。
例はRubyで書かれていますが、POSTが可能な言語ならなんでも大丈夫です。
横道
内田真礼さんの2ndライブが2017年2月26日(日)に開催決定しました
とてもめでたい
ところでその日は卒論&修論の前の日です
クソが!!
閑話休題
ことのはじめ
これをやろうと思ったきっかけについて
私は研究で1日1回、cronを使いスクレイピングでデータをとってきたり、
その情報から様々なデータを作成・登録したりしています。
その際、今まで何度かページのDOM構造が変わっていたり、
コードに不備があったりして、処理が正常に実行されずエラーが起きることがありました。
しかし、毎日ログを見に行けるわけではないので、
エラーを見逃して処理が止まっていることがたびたびありました。
そのため、普段見るチャットツールであるslackにlogを毎日流そうと思ったわけです!!
※ slackってなに?
https://seleck.cc/406
Slack 準備編
1. 情報を流したいSlackのチーム名を選び、Apps&integrations
をクリック
2. incoming WebHooksを加える
以下のような画面にとぶと思うので、Incoming WebHooksを選択
Add Comfiguration
をクリック
3. post先やBotのアカウントの情報の変更
準備完了
あとは上記の画像の隠されてる部分にあるURLにPOSTを送るだけです。
実践編
実装は基本的には、以下の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タスクが成功した場合は
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タスクの一部抜粋
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
試してみた
正常とエラーの場合をそれぞれ試してみた。(エラーは長いので一部省略)
なにか足りない
幸せ
おわりに
ということで今回は、cronのログをSlackに流してみたのを紹介しました。
これで、皆さんも快適なcronライフを!!
できるだけ簡単にできる方法を選んだつもりですが、「この方がもっといいよ」みたいなのあったら教えて欲しいです。