LoginSignup
4
7

More than 5 years have passed since last update.

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

Posted at

はじめに :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ライフを!!

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

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7