rsyslogの受信側を構築する (新フォーマット形式)

背景

アプリのログをsyslogでリモートサーバーに集約することにしました。
そこで、rsyslog を導入し、アプリ単位でログ出力+通知を実装します。

以下のページに記載の新フォーマット形式(RainerScript)を使用します。(v7.3.6以降)
https://www.rsyslog.com/doc/configuration/converting_to_new_format.html

環境

OS: Rocky Linux 8
CPU: 4Core
Mem: 8GB
SSD: 50GB

手順

1. rsyslogのインストール

# 公式リポジトリを追加
# 参考:https://www.rsyslog.com/rhelcentos-rpms/
cd /etc/yum.repos.d/
sudo wget http://rpms.adiscon.com/v8-stable/rsyslog.repo

# インストール
sudo dnf install rsyslog rsyslog-omhttp

※ Webhookを使用するため omhttp という公式モジュールを使用します
https://www.rsyslog.com/doc/configuration/modules/omhttp.html

2. 有効化

sudo systemctl enable rsyslog
sudo systemctl start rsyslog

3. 受信設定

sudo vi /etc/rsyslog.conf

# UDPで受信する場合
module(load="imudp")
input(type="imudp" port="514")

# TCPで受信する場合
#module(load="imtcp")
#input(type="imtcp" port="514")

※ デフォルトでは以下のようなフォーマットが使用されている場合がありますが、これは旧来のフォーマットのため新しいバージョンでは非推奨となっています (使用しても問題は無いそう)
 新旧混在可能なため、このフォーマットを使用しても構いません。

#$ModLoad imudp
#$UDPServerRun 514


4. firewall

# 514ポートを開ける
sudo firewall-cmd --add-port=514/udp --permanent
# sudo firewall-cmd --add-port=514/tcp --permanent

sudo firewall-cmd --reload

rsyslogの再起動

sudo systemctl restart rsyslog

動作確認

他ホストからsyslogメッセージを送信し、
/var/log/messages や /var/log/syslog などのログファイルに記録されるか確認します。

logger -n <syslogサーバーIP> -P 514 -d "テストメッセージ"

ログの保存先変更・通知

次に、特定の送信元やアプリごとにログを別ファイルに分けます。
また、併せてクリティカルなログをDiscordに通知するよう構成します。

物理・ネットワーク機器のログ:

sudo vi /etc/rsyslog.d/network.conf
# ルーターのログ(例: 物理・仮想機器は $hostname で振り分け)
if $hostname == 'router-001' then {
    action(type="omfile" file="/var/log/router.log")
    stop
}

# ロードバランサーのログ
if $hostname == 'lb-001' then {
    action(type="omfile" file="/var/log/lb.log")
    stop
}

アプリのログ:
※ 一部はDiscordのWebhookで通知します

sudo vi /etc/rsyslog.d/app.conf 
module(load="omhttp")

# Discord通知用テンプレート
template(name="discord_template" type="string" string="{\"content\":\"[ALERT] %app-name%: %msg%\"}")

# アプリのログ($app-nameで振り分け)
if ($app-name == 'my-app') then {
    # ログファイルに出力
    action(type="omfile" file="/var/log/my-app.log")

    # Discord通知(Error含む or severityがerror/crit)
    if ($msg contains "Error" or $syslogseverity == 3 or $syslogseverity == 2) then {
        action (
            type="omhttp"
            server="discord.com"
            serverport="443"
            restpath="/api/webhooks/XXXXXXXX/YYYYYYYY"
            usehttps="on"
            httpheaders=["Content-Type: application/json"]
            format="json"
            template="discord_template"
        )
    }
    stop
}

※ Slack通知の場合はテンプレートが若干変わります

# template(name="discord_template" type="string" string="{\"content\":\"[ALERT] %app-name%: %msg%\"}")
template(name="slack_template" type="string" string="{\"text\":\"[ALERT] %app-name%: %msg%\"}")

リロード:

sudo systemctl restart rsyslog

テスト

リモートから以下のようなコマンドを実行して動作確認します。

logger -n <syslogサーバーIP> -P 514 --rfc5424 -t my-app "テスト" 

参考:トラブルシュート

ジャーナル:

sudo journalctl -u rsyslog

構文チェック:

sudo rsyslogd -N1

以上

参考文献

23.2. Rsyslog の基本設定 | システム管理者のガイド | Red Hat Enterprise Linux | 7 | Red Hat Documentation
23.2. Rsyslog の基本設定 | システム管理者のガイド | Red Hat Enterprise Linux | 7 | Red Hat Documentation
23.2. Rsyslog の基本設定 | システム管理者のガイド | Red Hat Enterprise Linux | 7 | Red Hat Documentation
23.2. Rsyslog の基本設定 | システム管理者のガイド | Red Hat Enterprise Linux | 7 | Red Hat Documentation
RSyslog Documentation - rsyslog
RSyslog Documentation - rsyslog

コメント

タイトルとURLをコピーしました