WebサーバのエラーログをSlackに投稿してみた

この記事ではApache httpdサーバのApacheエラーログとPHPエラーログをSlackに投稿する方法をまとめました。

やりたいこと

当サイトをWebサーバで運用するにあたり、健全性を保つには定期的にログを確認する必要があります。しかし、毎日サーバに接続してコマンドを実行して内容を確認するのは大変です。そこで、内容チェックは手動でやるにしても、ログの表示までの手順を簡略化しようと思い実装しました。エラーログの内容をSlackに投稿することで、Slackを見るだけでエラーの内容を確認できるようにします。

Slack AppでWebHookのリクエストを待ち受け、サーバのスケジューラでリクエストを送信するスクリプトを実行します。

実装

Slackの設定

Slackのアプリから[App]をクリックします。

 

検索ツールで[webhook]で検索します。検索結果に表示される[Incoming WebHook]の[追加]をクリックします。

 

ブラウザのslackのアプリのページに遷移します。設定により権限が必要な場合があります。その場合は[設定をリクエストする]より管理者にリクエストを送信します。

 

リクエストが承認されるとSlackbotから以下のような通知がきます。[App ディレクトリに移動する]をクリックします。

 

ブラウザのSlackのアプリの設定ページに遷移します。[Webhook URL]をコピーし、後述のスクリプトに貼り付けます。

シェルスクリプト

以下はスクリプトの一例です。

#!/bin/sh

# ログをチェックしてslackに投稿するスクリプト

# 前日のapacheエラーログ、phpエラーログを指定したチャンネルに投稿


# slack設定
URL="[webhookURL]"

USERNAME="[botの表示名]"
CHANNEL="#[送信先チャンネル]"
ICON=":abc:"


# ログの取得
DATE_APACHE=$(LC_ALL=C date -v -1d "+%h %d") 
DATE_PHP=$(LC_ALL=C date -v -1d "+%d-%h-%Y")

LOG_APACHE=$(grep "$DATE_APACHE" /var/log/httpd/error_log)
LOG_PHP=$(grep "$DATE_PHP" /var/log/httpd/error.log)


# メッセージ整形
TEXT=$(cat << EOF
apache
-----------------------------
$LOG_APACHE
-----------------------------

php
-----------------------------
$LOG_PHP
-----------------------------
EOF
)

POST=$(cat << EOF
    payload={
    "channel": "$CHANNEL",
    "username": "$USERNAME",
    "icon_emoji": "$ICON",
    "text": "$TEXT"
  }
EOF
)

# Slackへ送信
curl -X POST --data-urlencode "$POST" $URL
[webhookURL]を先程コピーしたURLに置換します。USERNAMEはbotの表示名、 CHANNELは送信先チャンネル、 ICONはbotのアイコンを設定します。TEXTを書き換えることで送信メッセージを編集できます。

WebHookでは、curlを使ってbotのURLにPOSTします。

スケジューラ

上記スクリプトを定期的に実行するためにcronによるスケジューリングを設定します。下記の例では毎朝9:00に実行します。

# crontab -e
0       9       *       *       *             /path/to/script/log_check.sh 1> /dev/null

 

以上です。

注意点ですが、上記スクリプトはログの容量が大きすぎるとARG_MAXを超えてしまい、curlを実行できない場合があります。ARG_MAXを増やすか、エラーを修正してログ容量を減らす必要があります。スクリプトを修正すべきそもそも表示しきれない程の大量のエラーが出ている状態は良くないのでエラーを修正することをお勧めします。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です