背景
アプリのログを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
コメント