Monitでサーバー監視(ログ監視)

概要

今回はMonitでログの監視を行います。
前回前々回のmonitブログではCentOSを使用していましたが、今回はRed Hat Enterprise Linuxを使用する為、monitのインストールから実施します。monitのマイナーバージョンも変わっています。
Red Hatのライセンスは「Red Hat Developer Subscription for Individuals」を使用しています。

検証環境

OSRed Hat Enterprise Linux 8.6 (Ootpa)
監視monit-5.30.0-1.el8

構築方法

[1]インストール

monitはepelリポジトリにあるので、まずepelをインストールし、その後monitをインストールします。
※epelは基本的にRed Hatのサポート対象外となります。

# subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf install monit

codeready-builder(開発者向け追加パッケージ)はEPEL webサイトの説明で有効にするように記載があったので実行しています。

[2]自動起動設定

前々回のブログ記事では、monitdプロセスの異常停止時に自動的に再起動する設定を施していましたが、今回導入するmonit-5.30では最初から設定が入っています。(Restart=on-abnormalの設定)

# cat /usr/lib/systemd/system/monit.service
[Unit]
Description=Pro-active monitoring utility for unix systems
After=network-online.target
Documentation=man:monit(1) https://mmonit.com/wiki/Monit/HowTo

[Service]
Type=simple
KillMode=process
ExecStart=/usr/bin/monit -I
ExecStop=/usr/bin/monit quit
ExecReload=/usr/bin/monit reload
Restart=on-abnormal
StandardOutput=null

[Install]
WantedBy=multi-user.target

[3]メインの設定ファイル

前々回のブログ記事を参照してください。ほぼ同じです。

[4]監視設定ファイル

今回はsyslogが出力するmessagesファイルを監視します。
設定ファイルは、新しく/etc/monit.d/messagesを作成します。

# vi /etc/monit.d/messages
check file messages with path /var/log/messages
      if content = "error" then alert

上記で監視間隔毎にファイルのテキストが検査されます。
monit起動時に対象ファイルの最後に読み取り位置が設定され、監視間隔毎にファイルの最後まで検査されます。

条件の書式は、「IF CONTENT <operator> <regex|path> THEN <action>」となっており、operatorには一致を表す「=」、不一致を表す「!=」のいずれかを指定できます。
ややわかりにくいですが、<regex>が含まれる行が検出される動作です。
<path>は拡張正規表現を含むファイルへの絶対パスとなります。複数行記載が可能です。
上記messagesの設定では記載していませんが「ignore content = "monit"」というように最初の条件にIGNORE CONTENTを入れることで除外する文字列も指定可能です。

上記のerrorという文字列を検知する設定を行い、loggerでテストしてみます。連続で3回loggerを実行しています。

# logger error
# logger error
# logger error

# tail /var/log/messages
Sep 20 10:10:42 monit02 systemd[1]: Starting System Logging Service..
Sep 20 10:27:18 monit02 root[20417]: error
Sep 20 10:27:18 monit02 root[20418]: error
Sep 20 10:27:19 monit02 root[20419]: error

以下の様なアラートメールが届きました。きちんと3回分検知しています。
1監視間隔内に検知対象のワードが複数回出現した場合のメール通知は1通にまとめられています。

Subject: monit alert --  monit02.cvtk.test Content match messages
Date: Tue, 20 Sep 2022 01:27:44 GMT
X-Mailer: Monit 5.30.0
Content-Type: text/plain; charset=utf-8
Status: R

Content match Service messages
                Date:        Tue, 20 Sep 2022 10:27:44
                Action:      alert
                Host:        monit02.cvtk.test
                Description: content match:
Sep 20 10:27:18 monit02 root[20844]: error
Sep 20 10:27:18 monit02 root[20845]: error
Sep 20 10:27:19 monit02 root[20846]: error


           Your faithful employee,
           Monit

次は<path>で検知対象を記載したファイルを指定した場合の確認を行います。
対象ファイルはどこにおいても良いのですが、/etc/monit.word ディレクトリを作成し、その中にmessages.txtを作成します。

# mkidr /etc/monit.word
# vi /etc/monit.word/messages.txt
error
warn.*
.*emerg.*

設定ファイルも<path>を指定するように書き換えます。

# vi /etc/monit.d/messages
check file messages with path /var/log/messages
      if content = "/etc/monit.word/messages.txt" then alert

シンタックスチェックを行い、OKであればmonitをreloadします。

# monit -t
Control file syntax OK
# monit reload
Reinitializing monit daemon

loggerでテストしてみます。messages.txtに記載した条件にそれぞれあてはまるように実行します。

# logger error
# logger warning
# logger "System is in an emergency."

# tail /var/log/messages
Sep 20 13:12:11 monit02 root[21002]: error
Sep 20 13:12:11 monit02 root[21003]: warning
Sep 20 13:12:12 monit02 root[21004]: System is in an emergency.

<path>でファイルを指定した場合、1監視間隔内に3回loggerで検知対象ログを出力しましたが、
それぞれ分かれてメール通知が来ました。

Subject: monit alert --  monit02.cvtk.test Content match messages
Date: Tue, 20 Sep 2022 04:12:55 GMT
X-Mailer: Monit 5.30.0
Content-Type: text/plain; charset=utf-8
Status: R

Content match Service messages
                Date:        Tue, 20 Sep 2022 13:12:55
                Action:      alert
                Host:        monit02.cvtk.test
                Description: content match:
Sep 20 13:12:11 monit02 root[21002]: error


           Your faithful employee,
           Monit
Subject: monit alert --  monit02.cvtk.test Content match messages
Date: Tue, 20 Sep 2022 04:12:55 GMT
X-Mailer: Monit 5.30.0
Content-Type: text/plain; charset=utf-8
Status: R

Content match Service messages
                Date:        Tue, 20 Sep 2022 13:12:55
                Action:      alert
                Host:        monit02.cvtk.test
                Description: content match:
Sep 20 13:12:11 monit02 root[21003]: warning


           Your faithful employee,
           Monit
Subject: monit alert --  monit02.cvtk.test Content match messages
Date: Tue, 20 Sep 2022 04:12:55 GMT
X-Mailer: Monit 5.30.0
Content-Type: text/plain; charset=utf-8
Status: R

Content match Service messages
                Date:        Tue, 20 Sep 2022 13:12:55
                Action:      alert
                Host:        monit02.cvtk.test
                Description: content match:
Sep 20 13:12:12 monit02 root[21004]: System is in an emergency.


           Your faithful employee,
           Monit

<path>でファイルを指定した場合、ファイル内の各行に対してif contentの判定を行っているようです。

これでログ監視もできるようになりました。
syslogにより出力されるログを監視する場合、FacilityとSeverity、特にSeverityで監視したいところです。しかしRHEL8バンドルのrsyslog(8.2102.0-7)においてデフォルトではログにSeverityは出力されません。
monitはログに出力された文字列を検査しており、表示されない文字列は検知できないようです。
また、rsyslogで用意されている出力フォーマットのテンプレートでもSeverityを出力するフォーマットは一部(Debug用、DB用)を除いて用意されていません。
どうしてもSeverityで検知したい場合は、行の先頭に"<"、">"で括った数字のPRIORITYを出力するフォーマットテンプレートを使用するか、自前のテンプレートを作成する方法がありますが、PRIORITYの数字は「Facility * 8 + Severity」という計算式で求められる1~3桁の数字となり、この数字からSeverityを求めるとなるとやや難解なスクリプトを書く羽目になり、面倒なのでおとなしくsyslogseverity-textを出力する自前テンプレートを作成した方がよさそうです。

技術情報

商標について

関連サービス

OSS導入支援

お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]

お問い合わせ