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

