Mackerel を触ってみる(ログ監視編)
はじめに
これらのブログの続編になります。
前提知識
Mackerel の公式チェックプラグイン集の check-log
を使うとログ監視が行えます。
check-log
を使うためには公式チェックプラグイン集を事前にインストールしておく必要があります。
インストールについてはこちらのブログで実施しているので、興味がある方はこちらをご覧ください。
やってみる
mackerel-agent.conf を編集し、ログ監視を実装してみます。
1. rsyslog をインストールする
検証用に作成した EC2 の OS は Amazon Linux 2023(以降、AL2023 と表記)です。
Amazon Linux 2 までは /var/log/messages
システムログが出力されていましたが、AL2023 から /var/log/messages
等のログが作成されなくなりました。
しかし、check-log
を使用してログ監視するためには、システムログを出力したいです。
そこで、rsyslog をインストールしてログファイルが作成されるようにします。
セッションマネージャー経由で監視対象の EC2 にログインします。
rsyslog をインストール&起動して、/var/log/messages
が作成されたことを確認します。
実際のログ
$ sudo dnf update
Last metadata expiration check: 1 day, 4:15:12 ago on Tue Aug 27 01:53:18 2024.
Dependencies resolved.
Nothing to do.
Complete!
$
$ cd /var/log
### messages が存在していないことを確認
$ ls -l
total 1612
lrwxrwxrwx. 1 root root 39 Aug 15 17:16 README -> ../../usr/share/doc/systemd/README.logs
drwxr-xr-x. 4 root root 34 Aug 28 05:17 amazon
drwx------. 2 root root 23 Aug 27 01:47 audit
-rw-rw----. 1 root utmp 0 Aug 15 17:16 btmp
drwxr-x---. 2 chrony chrony 72 Aug 27 01:47 chrony
-rw-r-----. 1 root adm 8806 Aug 28 05:17 cloud-init-output.log
-rw-r-----. 1 root adm 367742 Aug 28 05:17 cloud-init.log
-rw-r--r--. 1 root root 874026 Aug 28 06:08 dnf.librepo.log
-rw-r--r--. 1 root root 288949 Aug 28 06:08 dnf.log
-rw-r--r--. 1 root root 84456 Aug 28 06:08 dnf.rpm.log
-rw-r--r--. 1 root root 3079 Aug 28 06:08 hawkey.log
drwxr-sr-x+ 3 root systemd-journal 46 Aug 27 01:47 journal
-rw-rw-r--. 1 root utmp 0 Aug 15 17:15 lastlog
drwx------. 2 root root 6 Aug 15 17:16 private
drwxr-xr-x. 2 root root 30 Aug 28 05:16 sa
drwxr-x---. 2 root root 6 Jun 12 22:04 sssd
-rw-------. 1 root root 0 Aug 15 17:16 tallylog
-rw-rw-r--. 1 root utmp 9216 Aug 28 05:17 wtmp
$
### rsyslog をインストール
$ sudo dnf install rsyslog
Last metadata expiration check: 1 day, 4:16:01 ago on Tue Aug 27 01:53:18 2024.
Dependencies resolved.
================================================================================================================================================
Package Architecture Version Repository Size
================================================================================================================================================
Installing:
rsyslog x86_64 8.2204.0-3.amzn2023.0.4 amazonlinux 784 k
Installing dependencies:
libestr x86_64 0.1.11-1.amzn2023.0.2 amazonlinux 26 k
libfastjson x86_64 0.99.9-1.amzn2023.0.3 amazonlinux 39 k
Installing weak dependencies:
rsyslog-logrotate x86_64 8.2204.0-3.amzn2023.0.4 amazonlinux 10 k
Transaction Summary
================================================================================================================================================
Install 4 Packages
Total download size: 859 k
Installed size: 2.8 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): libestr-0.1.11-1.amzn2023.0.2.x86_64.rpm 400 kB/s | 26 kB 00:00
(2/4): libfastjson-0.99.9-1.amzn2023.0.3.x86_64.rpm 556 kB/s | 39 kB 00:00
(3/4): rsyslog-8.2204.0-3.amzn2023.0.4.x86_64.rpm 9.1 MB/s | 784 kB 00:00
(4/4): rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64.rpm 517 kB/s | 10 kB 00:00
------------------------------------------------------------------------------------------------------------------------------------------------
Total 5.5 MB/s | 859 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : libfastjson-0.99.9-1.amzn2023.0.3.x86_64 1/4
Installing : libestr-0.1.11-1.amzn2023.0.2.x86_64 2/4
Installing : rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64 3/4
Installing : rsyslog-8.2204.0-3.amzn2023.0.4.x86_64 4/4
Running scriptlet: rsyslog-8.2204.0-3.amzn2023.0.4.x86_64 4/4
Created symlink /etc/systemd/system/multi-user.target.wants/rsyslog.service → /usr/lib/systemd/system/rsyslog.service.
Verifying : libestr-0.1.11-1.amzn2023.0.2.x86_64 1/4
Verifying : libfastjson-0.99.9-1.amzn2023.0.3.x86_64 2/4
Verifying : rsyslog-8.2204.0-3.amzn2023.0.4.x86_64 3/4
Verifying : rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64 4/4
Installed:
libestr-0.1.11-1.amzn2023.0.2.x86_64 libfastjson-0.99.9-1.amzn2023.0.3.x86_64 rsyslog-8.2204.0-3.amzn2023.0.4.x86_64
rsyslog-logrotate-8.2204.0-3.amzn2023.0.4.x86_64
Complete!
$
### messages が作成されたことを確認
$ ls -l
total 1648
lrwxrwxrwx. 1 root root 39 Aug 15 17:16 README -> ../../usr/share/doc/systemd/README.logs
drwxr-xr-x. 4 root root 34 Aug 28 05:17 amazon
drwx------. 2 root root 23 Aug 27 01:47 audit
-rw-rw----. 1 root utmp 0 Aug 15 17:16 btmp
drwxr-x---. 2 chrony chrony 72 Aug 27 01:47 chrony
-rw-r-----. 1 root adm 8806 Aug 28 05:17 cloud-init-output.log
-rw-r-----. 1 root adm 367742 Aug 28 05:17 cloud-init.log
-rw-r--r--. 1 root root 875926 Aug 28 06:09 dnf.librepo.log
-rw-r--r--. 1 root root 294805 Aug 28 06:09 dnf.log
-rw-r--r--. 1 root root 85012 Aug 28 06:09 dnf.rpm.log
-rw-r--r--. 1 root root 3259 Aug 28 06:09 hawkey.log
drwxr-sr-x+ 3 root systemd-journal 46 Aug 27 01:47 journal
-rw-rw-r--. 1 root utmp 0 Aug 15 17:15 lastlog
-rw-------. 1 root root 0 Aug 28 06:09 maillog
-rw-------. 1 root root 0 Aug 28 06:09 messages
drwx------. 2 root root 6 Aug 15 17:16 private
drwxr-xr-x. 2 root root 30 Aug 28 05:16 sa
-rw-------. 1 root root 0 Aug 28 06:09 secure
-rw-------. 1 root root 0 Aug 28 06:09 spooler
drwxr-x---. 2 root root 6 Jun 12 22:04 sssd
-rw-------. 1 root root 0 Aug 15 17:16 tallylog
-rw-rw-r--. 1 root utmp 9216 Aug 28 05:17 wtmp
$
### rsyslog のステータス確認
$ systemctl status rsyslog
○ rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
Active: inactive (dead)
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
$
### システム起動時に rsyslog が自動起動するように設定
$ sudo systemctl enable rsyslog
$ systemctl status rsyslog
○ rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
Active: inactive (dead)
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
$
### rsyslog を手動起動
$ sudo systemctl start rsyslog
### rsyslog のステータス確認
$ systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; preset: enabled)
Active: active (running) since Wed 2024-08-28 06:11:46 UTC; 2s ago
Docs: man:rsyslogd(8)
https://www.rsyslog.com/doc/
Main PID: 4553 (rsyslogd)
Tasks: 3 (limit: 508)
Memory: 3.9M
CPU: 434ms
CGroup: /system.slice/rsyslog.service
└─4553 /usr/sbin/rsyslogd -n
$
/etc/rsyslog.conf
の内容を確認すると、デフォルトで以下の記載がありました。
*.info;mail.none;authpriv.none;cron.none /var/log/messages
「すべてのプライオリティレベルのメッセージのうち、メール、認証、cron 関連のメッセージを除いたものが、/var/log/messages に記録される」
という設定であることが分かります。
実施したいログ監視のテストは現在の設定で実施できることが分かったので、/etc/rsyslog.conf
はそのまま使用します。
2. mackerel-agent.conf を編集する
セッションマネージャー経由で監視対象の EC2 にログインします。
/etc/mackerel-agent/mackerel-agent.conf
は、デフォルトだと以下のように API キーだけ記載されていて、それ以外はコメントアウトされた状態です。
/etc/mackerel-agent/mackerel-agent.conf
apikey = "APIキー"
# pidfile = "/var/run/mackerel-agent.pid"
# root = "/var/lib/mackerel-agent"
# verbose = false
# apikey = ""
# [host_status]
# on_start = "working"
# on_stop = "poweroff"
# [filesystems]
# ignore = "/dev/ram.*"
# Configuration for Custom Metrics Plugins
# see also: https://mackerel.io/ja/docs/entry/advanced/custom-metrics
# followings are mackerel-agent-plugins https://github.com/mackerelio/mackerel-agent-plugins
# Plugin for Apache2 mod_status
# By default, the plugin accesses to http://127.0.0.1/server-status?auto
# [plugin.metrics.apache2]
# command = "mackerel-plugin-apache2"
# Plugin for EC2 CPU Credit
# [plugin.metrics.aws-ec2_cpucredit]
# command = "mackerel-plugin-aws-ec2-cpucredit"
# Plugin for AWS ELB
# [plugin.metrics.aws-elb]
# command = "mackerel-plugin-aws-elb"
# Plugin for Amazon RDS
# [plugin.metrics.aws-rds]
# command = "mackerel-plugin-aws-rds -identifier=<required>"
# Plugin for Elasticsearch
# By default, the plugin accesses Elasticsearch on localhost.
# [plugin.metrics.elasticsearch]
# command = "mackerel-plugin-elasticsearch"
# Plugin for HAProxy
# By default, the plugin accesses Elasticsearch on localhost.
# [plugin.metrics.haproxy]
# command = "mackerel-plugin-haproxy"
# Plugin for JVM
# Required javaname
# [plugin.metrics.jvm]
# command = "mackerel-plugin-jvm -javaname=<required>"
# Plugin for Linux
# [plugin.metrics.linux]
# command = "mackerel-plugin-linux"
# Plugin for Memcached
# [plugin.metrics.memcached]
# command = "mackerel-plugin-memcached"
# Plugin for MongoDB
# [plugin.metrics.mongodb]
# command = "mackerel-plugin-mongodb"
# Plugin for MySQL
# Appropriate previlege settings required.
# By default, the plugin accesses MySQL on localhost by 'root' with no password.
# [plugin.metrics.mysql]
# command = "mackerel-plugin-mysql"
# Plugin for Nginx
# By default, the plugin accesses to http://localhost:8080/nginx_status
# [plugin.metrics.nginx]
# command = "mackerel-plugin-nginx"
# Plugin for PHP APC
# [plugin.metrics.php-apc]
# command = "mackerel-plugin-php-apc"
# Plugin for Plack
# By default, the plugin accesses to http://localhost:5000/server-status?json
# [plugin.metrics.plack]
# command = "mackerel-plugin-plack"
# Plugin for PostgreSQL
# Appropriate previlege settings required.
# By default, the plugin accesses PostgreSQL on localhost.
# [plugin.metrics.postgres]
# command = "mackerel-plugin-postgres"
# Plugin for Redis
# By default, the plugin accesses Redis on localhost.
# [plugin.metrics.redis]
# command = "mackerel-plugin-redis"
# Plugin for SNMP
# [plugin.metrics.pps]
# command = "mackerel-plugin-snmp -name='pps' -community='private' '.1.3.6.1.2.1.31.1.1.1.7.2:eth01in:1:0' '.1.3.6.1.2.1.31.1.1.1.11.2:eth01out:1:0'"
# Plugin for Squid
# [plugin.metrics.squid]
# command = "mackerel-plugin-squid"
# Plugin for Varnish
# [plugin.metrics.varnish]
# command = "mackerel-plugin-varnish"
# Plugin for munin (wrapper)
# [plugin.metrics.nfsd]
# command = "mackerel-plugin-munin -plugin=/usr/share/munin/plugins/nfsd"
# [plugin.metrics.bind9]
# command = "mackerel-plugin-munin -plugin=/etc/munin/plugins/bind9 -plugin-conf-d=/etc/munin/plugin-conf.d"
# [plugin.metrics.postfix]
# command = "MUNIN_LIBDIR=/usr/share/munin mackerel-plugin-munin -plugin=/usr/share/munin/plugins/postfix_mailqueue -name=postfix.mailqueue"
# followings are other samples
# [plugin.metrics.vmstat]
# command = "ruby /etc/sensu/plugins/system/vmstat-metrics.rb"
# [plugin.metrics.curl]
# command = "ruby /etc/sensu/plugins/http/metrics-curl.rb"
mackerel-agent.conf
に設定を追加します。
実際のログ
$ cd /etc/mackerel-agent/
$ ls -l
total 4
-rw-r--r--. 1 root root 3605 Aug 27 01:53 mackerel-agent.conf
$
$ sudo vi mackerel-agent.conf
== vi 上で以下を追記する ==
# check-log
[plugin.checks.Log_Messages_Error]
command = ["check-log", "--file", "/var/log/messages", "--pattern", "error", "--icase" ]
prevent_alert_auto_close = true
== ここまで ==
### 設定ファイル(mackerel-agent.conf)のシンタックスチェック
$ sudo mackerel-agent configtest
SUCCESS (/etc/mackerel-agent/mackerel-agent.conf)
$
### mackerel-agent を再起動
$ sudo systemctl restart mackerel-agent
$
vi で追記した設定は、
「/var/log/messages
ファイルの中に "error" という文字列(大小文字を区別しない)が含まれているかをチェックし、見つかった場合にアラートを発報する」
というものです。
(ちなみに prevent_alert_auto_close = true
により、アラート発生以後の監視結果が OK になってもアラートは自動でクローズされず、オープンのままになるため、手動クローズが必要という設定です)
以上で mackerel-agent.conf
の編集は完了です。
Mackerel のホスト詳細画面で確認すると、Monitors 欄に「Log_Messages_Error」が追加されました。
次は実際にアラート発報ができるかテストしてみます。
3. テストしてみる
再びセッションマネージャー経由で EC2 にログインします。
EC2 上で以下コマンドを実行します。
sudo logger -p err "This is a test error message for Mackerel"
上記のコマンドは、
「logger
コマンドを実行し、エラーレベルのログメッセージ「This is a test error message for Mackerel」を syslog デーモンに送信する」
というものです。
実行後、数分経たずしてアラートメールを受信しました。
Mackerel でもアラートが上がっていることが確認できました。
手動クローズが必要という設定にしているため、テストが終わったら忘れずにクローズしておきましょう。
ということで、ログ監視を設定し、error という文字列が出力されたときにアラートが発報されることが確認できました。
(ちなみに、パターンのマッチ条件を「大小文字を区別しない」としたので、「This is a test ERROR message for Mackerel」も試してみましたが、ちゃんとアラート発報されました)
あとがき
本記事ではログ監視編として、rsyslog の準備、mackerel-agent.conf の編集、テストまでをまとめました。
この記事がどなたかのお役に立てれば幸いです。
参考資料
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は
様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。