この記事では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を増やすか、エラーを修正してログ容量を減らす必要があります。スクリプトを修正すべきそもそも表示しきれない程の大量のエラーが出ている状態は良くないのでエラーを修正することをお勧めします。