Rsyslog

提供: Wikinote
移動: 案内検索

一通り知っておくと、後々役に立ちそう。

設定

CentOS 6.4 の rsyslog-5.8.10 に含まれるマニュアルを読んで調べたものだが、 すべて試したわけではないので、実際に使えるかどうかはそれぞれの環境で要確認。

モジュール

$ModLoad でモジュールを読み込む。

UDP あるいは TCP ソケットで待ち受ける

syslogd では UDP のみに対応しており -r オプションだったが、 rsyslog ではオプションではなく rsyslog.conf に記述する。

$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514

基本構文

syslogd と同様に以下が基本。フィルタとアクションの区切りはスペースかタブ文字を使用できる。

フィルタ アクション

複数のアクションを適用する

フィルタ アクション1
& アクション2
& アクション3

マニュアルによると、処理効率の面からも同じフィルタを複数書かない方が良いとのこと。

破棄 (discard)

厳密にはアクションの 1 つだがここに。

フィルタ ~

メッセージは破棄され、これ以降のアクションは実行されない。

テンプレート

メッセージの出力形式をアクション単位で指定できる。

$template MyTemplate,"%TIMESTAMP% ..."
*.info  /var/log/messages;Mytemplate
*.err   /var/log/error
  • ファシリティ・プライオリティを syslogd の -SS オプションのように出力する
$template MySSTemplate,"%TIMESTAMP% <%syslogfacility-text%.%syslogpriority-text%> %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"

例) Apr 19 08:04:08 <user.notice> courier hagio: test
  • デフォルトのテンプレートを変更する
$ActionFileDefaultTemplate MyTemplate

フィルタ

セレクタ

syslogd と同じ伝統的な形式。

facility.priority
facility
主に:auth, authpriv, cron, daemon, kern, lpr, mail, news, syslog, user, uucp, local0 - local7
priority
主に:debug, info, notice, warning, err, crit, alert, emerg

主なルール

  • 指定した priority 以上のログにマッチする
  • アスタリスク (*) ですべての facility あるいは priority にマッチ
  • セミコロン (;) で複数のセレクタを指定可能
  • none で対象 facility を除外可能
  • コンマ (,) で複数の facility を指定可能
  • イコール (=) で特定の priority のみにマッチ
  • エクスクラメーションマーク (!) で priority 以上を無視
daemon.err       # daemon の err, crit, alert, emerg にマッチ

mail.*           # mail のすべてのログにマッチ
*.emerg          # すべての emerg のログにマッチ
*.*              # すべてのログにマッチ

daemon.warning;cron.err

*.*;mail.none    # mail 以外のすべてのログにマッチ

uucp,news.crit   # uucp と news の crit, alert, emerg にマッチ

daemon.=err      # daemon の err のみにマッチ

daemon.notice;daemon.!err    # daemon の notice と warning のみマッチ?(試してない)

プロパティベース フィルタ

rsyslogd 独自のフィルタ。

:property, [!]compare-operation, "value"
property

主なプロパティは以下。

msg 
メッセージ本体 (MSG)
hostname 
ホスト名
fromhost, fromhost-ip 
メッセージを送信したホスト名 or IP アドレス
syslogtag 
タグ部分 (TAG) (例:"kernel:", "ntpd[xxx]:")
programname 
タグ中の名前部分 (例:"kernel", "ntpd")
syslogfacility-text 
ファシリティ名
syslogpriority-text 
プライオリティ名
timegenerated 
メッセージを受信した日時
timestamp (timereported) 
メッセージのタイムスタンプ
compare-operations

以下があるらしいが全部は試していない。

contains 
文字列が含まれているかどうか。ワイルドカードは使用不可。
isequal 
exact マッチ
startswith 
指定した文字列から始まるかどうか。
regex 
POSIX BRE
ereregex 
POSIX ERE

マニュアルによると、正規表現を使わなくて良いのであればそちらの方が速い。

正規表現のサンプル:

:msg, regex, "fatal .* error"
value
  • クォートされた文字列を指定する。
  • エスケープシーケンス使用可 (\" でダブルクォート、\\ でバックスラッシュ)

評価式ベース フィルタ

日本語の名称は勝手に付けたものなので悪しからず。

if expr then アクション
  • すべて 1 行に記載しなければならない。
  • 正規表現には対応していない。
  • RainerScript というもので実装されているよう。マニュアル参照。

設定例:

if $syslogfacility-text == 'local0' and $msg startswith 'DEVNAME' and not ($msg contains 'error1' or $msg contains 'error0') then /var/log/somelog

アクション

ファイル出力

  • 基本的には "/" から始まる絶対パスを指定する。
  • 最初に "-" を付けると sync しない。
  • 動的にファイル・ディレクトリを作成して出力できる。
*.*  -/var/log/async.log

$template DynFile,"/var/log/%HOSTNAME%/%programname%.log"
*.*  ?DynFile

名前付きパイプ

  • 最初に "|" を付けて名前付きパイプを指定できる。
  • rsyslogd を起動する前に mkfifo しておかなければならない。
*.*  |/tmp/mylogpipe

リモートホスト

  • 最初に "@" で UDP 送信、"@@" で TCP 送信
  • 圧縮オプション "(z[1-9])" もある
*.*  @192.168.1.1:514
*.*  @@192.168.1.2:514

*.*  @(z9)192.168.1.3
  • sysklogd に送信する場合は、デフォルトのテンプレートだと問題があるため以下を使用する
$template sysklogd,"<%PRI%>%TIMESTAMP% %syslogtag%%msg%\""
*.*  @192.168.1.1;sysklogd

ユーザリスト

  • omusrmsg ビルトインモジュールを使う
  • "*" を指定すれば全員へ
*.crit  :omusrmsg:root,hagio
*.emerg :omusrmsg:*

シェル実行

  • サブシェルでプログラムが実行される。
  • テンプレートで生成されたメッセージがプログラムの引き数として渡される。
*.*  ^program;template