rsyslog からの外部コマンド実行

シェアする

rsyslogdを利用すると、特定の文字列が出ると外部コマンドを実行ができるようです。

利用例
  • 特定ログ出力時に、snmptrapd経由にてTrapを送信
  • 特定ログ出力時に、mail送信スクリプトを利用し出力内容のメールを送信
  • 特定ログ出力時に、あるサイトへメッセージのPOST投稿

と、バッチ処理とは違うリアルタイム性の処理が可能となります。実際リアルタイムの必要性があるのか?ですがSLAの関係で1分1秒を争うようなものにはいいかもです。

仕込み

rsyslog の omprog というモジュールを利用する方法です。omprogは、4.3.0から実装されているようであり、7.5.1以上だと実行時に引数を与える事が可能なようです。今回は特定のプライオリティが発生すると、コマンドを実行し時間とログ本文を別ファイルに出力させる仕組みを検討しました。

# vi /etc/rsyslog.d/crit-log.conf
module(load="omprog")
$template test_logformat, "time=%timegenerated:1:4:date-rfc3339%/%timegenerated:6:7:date-rfc3339%/%timegenerated:9:10:date-rfc3339% %timegenerated:12:19:date-rfc3339% msg=%msg%\n"

if $syslogseverity-text == "crit" then {
    action(
        type="omprog"
        binary="/usr/local/scripts/output.sh"
        template="test_logformat"
    )
}

簡単に説明すると、omprogのモジュールを呼び出して、特定ログフォーマットに出力されるログフォーマットを定義し、binaryで指定されたスクリプトを実行する!って感じで、とりあえず、上記にてクリティカル(Crit)のプライオリティレベルのログが出力されると、スクリプトが実行される仕組みとなっています。
詳細は、rsyslogのサイトを確認してください。

呼び出されるプログラム作成

呼び出されるプログラムとして、output.sh を呼び出しています。このoutput.shは、簡単に以下のように作成しています。

# vi /usr/local/scripts/output.sh
#! /bin/bash

while read line; do
  echo ${line} >> /var/tmp/test.log
done

うむ。この周りは私は理解していないが、実行されるプログラムに対し、whileのreadで渡せる何か文字列が渡っているんだろう。それを$lineで渡してみました。多分ログのテンプレートで改行とか入れても、処理できるんじゃねぇか?と思っています。

作成したプログラムは、chmod にて rsyslogの実行ユーザ(rootかな?)で実行できるようにパーミッションを適当に付与しました。実際問題起きてないので、rootで問題なかったのでしょう。

実行

準備が済んだので、実際に実行してみました。

systemctl restart rsyslog

そんでもって、

# logger -p daemon.crit hogehoge piyopiyo fugafuga

まずは、通常通りログが出ているかを確認

# cat /var/log/messages
Feb 12 23:45:04 sabao-srv xxxxx: hogehoge piyopiyo fugafuga

うむ。stopかけていないので、/var/log/messages には出力されました。続いて、/var/tmp/test.log にも出力されているかな?

# cat /var/tmp/test.log | tail -1
time=2018/02/12 23:45:04 msg=hogehoge piyopiyo fugafuga

うむ。同時刻に同じメッセージが出力されていたな。こんな感じで外部プログラムの呼び出しがrsyslogでは行え、そして外部プログラムへログ内容を渡せるようです。

rsyslogは、まだまだいろいろと実装できるような仕組みかもしれないですね。

ではでは。

トップへ戻る