晴耕雨読

working in the fields on fine days and reading books on rainy days

[rsyslog] アクションにおけるログ出力・保存の指定方法

ここでは、rsyslogにおいてアクションにおけるログ出力・保存を指定する方法について説明します。

アクションとは

rsyslogにおけるアクションとは、セレクタやフィルタに続けて、ログメッセージの保存方法や出力方法を指定するものです。 rsyslogでは次の処理をアクションとして指定することができます。

  • 通常ファイルへの出力 (/パス)
  • 複数アクションの指定 (&)
  • 名前付きパイプの利用 (|/)
  • ターミナルやコンソールへの出力
  • リモートSyslogサーバへの転送
  • ログイン中のユーザーへの通知
  • メッセージの破棄
  • シェルによるコマンドの実行 (^)

メッセージをファイルに出力する (/)

アクションに「/ (スラッシュ)」で始まるパスが指定されたとき、フィルターで抽出されたログを指定パスのファイルに書き込みます。 指定されたファイルが存在しないときは、rsyslogがファイルを自動生成します。

*.*    /var/log/messages

また、パスの後ろに「;テンプレート名」と記載することで、出力形式のテンプレートを指定することができます。 以下はテンプレートのMyCustomFormatを使ってログメッセージを保存する例です。

*.*    /var/log/messages;MyCustomFormat

メッセージの出力を非同期に行う (-)

アクションに「-/」で始まるパスが指定されたとき、フィルターで抽出されたログを指定パスのファイルに非同期で書き込みます。 つまり、データをハードディスクに書き込む前に、ある程度をバッファと呼ばれるメモリ上の領域に溜め込み、一定間隔でまとめてハードディスクに書き出されます。 これはパフォーマンスが向上する一方で、OSやシステムが不意に停止したときにログメッセージが消失する可能性があります。 そのような危険性を承知した上で使用する場合は、以下のように書くことができます。

*.*    -/var/log/messages

ファイル名を動的に生成する (?)

ファイルに出力するとき、固定のファイル名意外にも、プログラム名やホスト名をファイル名やディレクトリ名の中に動的に組み入れることができます。 動的ファイル名を利用することで、ホストやプログラム単位でログファイルを分けることができます。

$template MyCustomFormat, "/var/log/%hostname%/%programname%.log"
*.*    ?MyCustomFormat

複数のアクションを指定する (&)

1つのセレクタやフィルタに対して、マルチアクションを使って複数のアクションを指定することができます。 例えば、以下の例では、/var/log/messages にログを出力した後に、Syslogリモートサーバの 192.168.11.11 にログを転送する処理を行います。

*.*    /var/log/messages
& @@192.168.11.11

名前付きパイプを使ってメッセージをやり取りする (|/)

mkfifoコマンドで作成した名前付きパイプ (FIFO) を使って、rsyslogデーモン以外のプロセスと、ログメッセージをやり取りすることができます。

*.*    |/my_pipe

メッセージをターミナルやコンソールに出力する

ログの出力先を /dev/tty0 にすることで、コンソール画面にログメッセージを表示することができます。

*.*    /dev/tty0

UDPでログを転送する (@)

ログは自サーバにあるrsyslogとは別のリモートサーバに転送することができます。 リモートサーバにUDPでログを転送するときは「@転送先IP」を使います。

# 転送先IPのみ
*.*    @192.168.11.11
# 転送先IPとポート番号を指定
*.*    @192.168.11.11:514

TCPでログを転送する (@@)

リモートサーバにTCPでログを転送するときは「@@転送先IP」を使います。 @を2つ付けることでTCPとなり、より信頼性の高い通信になります。

# 転送先IPのみ
*.*    @@192.168.11.11
# 転送先IPとポート番号を指定
*.*    @@192.168.11.11:1470

転送ログをテンプレートで加工する

リモートサーバへ転送するSyslogデータも、テンプレートを使って加工することができます。 以下はリモートサーバへログを転送するときに、自分で定義したテンプレート sysklogd を使ってログを加工する例です。

$template sysklogd, "<%pri%>%timestamp% %syslogtag%%msg%"
*.*    @192.168.11.11;sysklogd

ログメッセージを破棄する

条件に一致したログを収集せずに破棄するには、アクションに「~ (チルダ)」を使います。 例えば、メールに関するログを全て破棄するには、次のように書きます。

mail.*    ~

ログの破棄は他の処理よりも優先して即座に実行されるため、ログを破棄すると、後続で条件に一致するフィルタが存在しても、後続のアクションは実行されません。

OSコマンドを実行する

特定のログメッセージを検出したときに、指定したコマンドやシェルスクリプトを実行させることができます。 具体的には、アクションに「^コマンド名」を使います。 指定したコマンドは、OSのsystem()関数を使って呼び出されます。

*.*    ^command

プロパティベースフィルタでログを抽出したときも同様です。

:msg, contains "server error"    ^poweroff

また、コマンドには最大1つの引数を渡すことができます。

$template ARGV, "%msg%"
:msg, contains "server error"    ^command:ARGV

注意点ですが、コマンドの実行に時間がかかると、複数のプロセスが同時に起動したままとなり、サーバのリソースをより多く消費してしまいます。

以上です。

参考資料