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

# はじめに :beginner:
この記事は、[SLP KBIT Advent Calender2016 その2](http://qiita.com/advent-calendar/2016/slp_kbit2)の17日目の記事になります。 

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

# 横道 :feet: 
[内田真礼](http://uchidamaaya.jp/)さんの2ndライブが2017年2月26日(日)に開催決定しました :bangbang:
とてもめでたい :congratulations: 

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

閑話休題

# ことのはじめ
これをやろうと思ったきっかけについて

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

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

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

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

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

# Slack 準備編

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

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/be790db0-4ecb-8954-a47f-3f6462ed72f2.png)

### 2. incoming WebHooksを加える
以下のような画面にとぶと思うので、Incoming WebHooksを選択

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/8020af99-3e3c-e243-a018-8f669c6a1853.png)

`Add Comfiguration`をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/96838/f21e33d9-380c-8180-aa8b-b02a7f9cbfed.png)

### 3. post先やBotのアカウントの情報の変更
![image](https://qiita-image-store.s3.amazonaws.com/0/96838/76ddad8a-55e0-db11-bd8d-a25f32d6d227.png)
 
### 準備完了 :thumbsup:
あとは上記の画像の隠されてる部分にあるURLにPOSTを送るだけです。

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

必要なgem

```rb
require 'net/http'
require 'uri'
require 'json'
```

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

```rb
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](https://qiita-image-store.s3.amazonaws.com/0/96838/c5e7a5a1-8b28-e241-b515-3a0a40de2fbb.png)
- エラーがでた場合
![image](https://qiita-image-store.s3.amazonaws.com/0/96838/cb7e0477-b410-a353-70d3-0f3463555a43.png)

# なにか足りない

### 幸せ :heart_eyes: 
![image](https://qiita-image-store.s3.amazonaws.com/0/96838/d9c8de14-cb09-2941-1c0a-7bce8c44c9b1.png)

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

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