OSSサポートエンジニアの現場から!特定の条件のログを/var/logs/messagesにも出力したい

OSSの現場から画像

こんにちは、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つずつ見ていきましょう。

  1. /var/log/messages の既存設定は維持する
    *.info;mail.none;authpriv.none;cron.none /var/log/messages
  2. module ブロックで imfile モジュールのロード
    module(load="imfile")
    rsyslog には「モジュール」という概念があり、デフォルトではカーネルログや標準の syslog ログを処理する機能のみが有効になっています。
    imfile は、ファイルを監視してログとして取り扱うためのモジュール です。
    そのため、外部ログを rsyslog に取り込むためには、まずこのモジュールをロードする必要があります。
    この行がないと、rsyslog は外部のログファイルを監視できません。
  3. 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 というルールセットはこの後設定します。
  4. 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に何も出力されない。

参考情報

Ruleset について詳しく知りたい方は、公式ドキュメントもご参照ください。
rsyslog / Multiple Rulesets in rsyslog

RedHat社のロギング説明も合わせてご参照ください。
RedHat 8 / 第8章 ロギングの設定

まとめ

今回は、rsyslogRuleset 機能 を活用することで、特定のログファイルから “ERROR” を含むログのみを抽出し、システムログ /var/log/messages に転送する方法をご紹介しました。

この設定を応用すれば、特定のエラーログだけをフィルタリングして通知したり、別のログファイルに転送したりすることも可能 です。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です