TORIPIYO DIARY

recent events, IoT, programming, security topics

td-agent-bitでapacheのエラーログを検知してslackに通知させる

td-agent-bitでapacheのエラーログが出力されるとslackに通知が送られるように、raspberry piに設定をしました。(ずいぶんと不恰好な実装になってしまいましたが。)なぜ、td-agentではなくて、td-agent-bitなのかというとサーバ内でのメモリの消費をできる限り抑えたかったからです。td-agent-bitを利用した設定に関する日本語の記事はほとんど見かけない(td-agentはよく見るけど)ので、誰かの役に立つことを祈って残しておきます。

fluentdとfluent-bitの違いはこちらを参照
Fluentd & Fluent Bit |

td-agent-bitのインストールと設定

Raspberry Pi · Fluent Bit v0.11 Documentation

  • td-agent-bit.confでは、apacheのerror.logをみて、ログレベルがerror, crit, alert, emergの時はoutput.txtに出力させるように設定をしています。
  • FILTERのMatchは、basic regular expressionの正規表現がサポートされているようで、|を使ったOR表現は利用できなかった。 結構ハマったので注意。

POSIX BRE does not support any other features. Even alternation is not supported.
http://www.regular-expressions.info/posix.html

# make directory
mkdir -p /home/pi/script/apache_error_log_check

# server gpg key
wget -qO - http://packages.fluentbit.io/fluentbit.key | sudo apt-key add -

# update your sources lists
echo "deb http://packages.fluentbit.io/raspbian jessie main" >> /etc/apt/sources.list

# update repository database
apt-get update

# install td-agent-bit
apt-get install td-agent-bit

# td-agent configuration for apache log
vi /etc/td-agent-bit/td-agent-bit.conf
----------------------------------------------------------------------------------------------
[SERVICE]
    Flush        5
    Daemon       Off
    Log_Level    info
    Parsers_File parsers.conf

# error level
[INPUT]
    Name tail
    Path /var/log/apache2/error.log
    Tag  apache2.error_log
    Parser apache_error

[FILTER]
    Name grep
    Match apache2.error_log
    Regex level error

[OUTPUT]
    Name file
    Match apache2.error_log
    Path /home/pi/script/apache_error_log_check/output.txt

# crit level
[INPUT]
    Name tail
    Path /var/log/apache2/error.log
    Tag  apache2.crit_log
    Parser apache_error

[FILTER]
    Name grep
    Match apache2.crit_log
    Regex level crit

[OUTPUT]
    Name file
    Match apache2.crit_log
    Path /home/pi/script/apache_error_log_check/output.txt

# alert level
[INPUT]
    Name tail
    Path /var/log/apache2/error.log
    Tag  apache2.alert_log
    Parser apache_error

[FILTER]
    Name grep
    Match apache2.alert_log
    Regex level alert

[OUTPUT]
    Name file
    Match apache2.alert_log
    Path /home/pi/script/apache_error_log_check/output.txt

# emerg level
[INPUT]
    Name tail
    Path /var/log/apache2/error.log
    Tag  apache2.emerg_log
    Parser apache_error

[FILTER]
    Name grep
    Match apache2.emerg_log
    Regex level emerg

[OUTPUT]
    Name file
    Match apache2.emerg_log
    Path /home/pi/script/apache_error_log_check/output.txt

----------------------------------------------------------------------------------------------

# enable td-agent daemon
systemctl list-unit-files | grep td-agent
systemctl enable td-agent-bit
systemctl list-unit-files | grep td-agent

# start td-agent-bit
service td-agent-bit start
service td-agent-bit status

この設定だけでは、output.txtにerror, crit, alert, emergレベルのログが出力されるだけなのでslackに通知するにはまだ設定が足りません。本当は、td-agent-bitのHTTP outputを使いたくてtd-agent-bit.confに設定を試みたのですが、どうしてもPOSTメソッドで正しい形式でデータを送る設定をすることができなかったので、苦肉の策でoutput.txtのハッシュ値を調べて、変化があったらslackに通知するhellscriptを書きました。

HTTP · Fluent Bit v0.11 Documentation

gist.github.com


上記のファイルを、cronで1分ごとに実行するように設定すればapacheのエラーログを検知できるようになります。ただ、これなら無理してtd-agent-bitを使わなくてもshellscriptだけでもいけるような。。。

# set cron job
mkdir -pv /home/pi/script/apache_error_log_check
cd /home/pi/script/apache_error_log_check && pwd

# put apache-error-log-check.sh script
vi apache-error-log-check.sh
chmod 744 apache-error-log-check.sh

# edit crontab
crontab -e
----------------------------------------------------------------------------------------------
# apache error log detection
* * * * * sh /home/pi/script/apache_error_log_check/apache-error-log-check.sh
----------------------------------------------------------------------------------------------

# test slack alert notification
curl http://localhost/-------------------------------------------------------------------------------