こんにちは、OSSよろず相談室のSKです。
日々、多くのOSSに関するお問い合わせをいただく中で、今回は rsyslog に関するご相談がありました。
「特定のログファイルから ERROR を含むログだけを抜き出して、システムログ(/var/log/messages)に転送したい」
そんなニーズに対して、rsyslog の Ruleset 機能 を活用することで解決できました。
同じような要件でお困りの方もいるかもしれませんので、今回の対応内容を紹介します。
やりたいこと
- 以下のログファイルに記録されるログのうち “ERROR” という文字列を含むログが出力されたら、
/var/log/messages
にも出力したい - 常時
/var/log/messages
に出力される OS や ネットワークなどシステム関連のログ出力はそのままにしたい。- 対象のログファイル:
/usr/local/share/oss-software/logs/system.log
- 対象のログファイル:
実現方法
以下が ‘/etc/rsyslog.conf’ に追加した設定内容の全体です。
*.info;mail.none;authpriv.none;cron.none /var/log/messages
module(load="imfile")
input(type="imfile"
File="/usr/local/share/oss-software/logs/system.log"
Tag="oss-softError"
Severity="info"
Facility="local0"
ruleset="extra-fileError")
ruleset(name="extra-fileError") {
if $msg contains 'ERROR' then {
action(type="omfile" file="/var/log/messages")
}
}
1つずつ見ていきましょう。
- /var/log/messages の既存設定は維持する
*.info;mail.none;authpriv.none;cron.none /var/log/messages
module
ブロックでimfile
モジュールのロード
module(load="imfile")
rsyslog には「モジュール」という概念があり、デフォルトではカーネルログや標準の syslog ログを処理する機能のみが有効になっています。
imfile
は、ファイルを監視してログとして取り扱うためのモジュール です。
そのため、外部ログを rsyslog に取り込むためには、まずこのモジュールをロードする必要があります。
この行がないと、rsyslog は外部のログファイルを監視できません。- input ブロックで外部ログファイルの監視設定
テキストファイルを読み込む設定をします。ここで監視対象のログファイルを指定します。
どのログファイルを監視し、どのように処理するかを指定します。input (type="imfile" …)
typeに 2.でロードした imfile モジュールを指定します。File="/usr/local/share/oss-software/logs/system.log"
監視対象のログファイルのパスです。
このファイルに新しいログが書き込まれると、rsyslogがその内容を取得して処理を行います。Tag="oss-softError"
ログのタグ(プレフィックス)を設定します。
このタグは、ログメッセージの識別に役立ちます。
ログメッセージの冒頭にこのタグが付加されて出力されます。Severity="info"
ログの重要度(Severity)を指定します。
rsyslogでは、ログの重要度(Severity)を指定することができます。
重要度には、emerg, alert, crit, err. warning, notice, info, debug
があります。
今回の設定では Severity=”info” となっているため、このログは「情報レベル」のログとして扱われます。Facility="local0"
ログの分類(Facility)を指定します。
この分類によって、ログを異なるファイルに振り分けたり、特定のフィルタを適用したりすることが可能になります。
今回の設定では、local0
を使用しています。
これにより、local0.* のログを特定のファイルに保存したり、処理を分けたりすることができます。ruleset="extra-fileError"
適用する Ruleset(処理ルール)を指定します。
ruleset
は、特定のルールに基づいてログを処理するための仕組みです。
この設定では、ruleset="extra-fileError"
を指定しているため、このログはextra-fileError
という名前のルールセットに従って処理されます。
extra-fileError というルールセットはこの後設定します。
- Ruleset を定義
“ERROR” を含むログのみを /var/log/messages に出力するルールセットを定義します。
ruleset(name="extra-fileError") { if $msg contains 'ERROR' then { action(type="omfile" file="/var/log/messages") } }
このルールセットでは、if $msg contains 'ERROR' then
という条件を設定し、ログメッセージに “ERROR” が含まれている場合に限り、/var/log/messages
に書き込むようにしています。
出力テスト
/var/log/messages
に、ERRORという文字を含むログだけが書き込まれるか、確認します。
- echoコマンドで、/usr/local/share/oss-software/logs/system.logに書き込んでみます。
- ERRORを含むログ出力
# echo "ERROR [Test] oss-software failed" | sudo tee -a /usr/local/share/oss-software/logs/system.log
→/var/log/messagesに以下が出力された- 出力結果
Mar 13 09:52:31 ip-172-31-1-204 oss-softError ERROR [Test] oss-software failed
Mar 13 09:52:31
: 日時ip-172-31-1-204
: ホスト名oss-softError
: 2の(2)で設定したタグERROR [Test] oss-software failed
: echoコマンドで指定した文字列
- 出力結果
- ERRORを含まないログ出力
# echo "$(date) INFO [Test] oss-software failed" | sudo tee -a /usr/local/share/oss-software/logs/system.log
→/var/log/messagesに何も出力されない。
- ERRORを含むログ出力
参考情報
Ruleset について詳しく知りたい方は、公式ドキュメントもご参照ください。
▶ rsyslog / Multiple Rulesets in rsyslog
RedHat社のロギング説明も合わせてご参照ください。
▶ RedHat 8 / 第8章 ロギングの設定
まとめ
今回は、rsyslog
の Ruleset
機能 を活用することで、特定のログファイルから “ERROR” を含むログのみを抽出し、システムログ /var/log/messages
に転送する方法をご紹介しました。
この設定を応用すれば、特定のエラーログだけをフィルタリングして通知したり、別のログファイルに転送したりすることも可能 です。