syslog

【図解/CentOS】rsyslogの仕組みと.confの設定例 〜template, property, ruleフィルタの種類〜

rsyslog の仕組み

rsyslog とは、ローカルおよびリモートサーバのログを管理するデーモンです。

CentOS では rsyslog は最小構成 (minimal) でも標準インストールされていますが、ログのフローはやや複雑です。

まず、ローカルのログ管理は journald (systemd-journald)というデーモンがメインで行っています。なのでローカルで生成されたログは /dev/log (unix socket file) 経由で systemd-journald が受信し、/run/log/journal 配下のデータベースに保管されます。(/run は tempfs なので再起動などのタイミングで消えてしまいます。)

次に、rsyslog では imjournal というim(Input Module)がデフォルトで有効になっており、このモジュールによって rsyslog に取り込まれ、設定に従った分類をした上で omfile という om (Output Module) によって /var/log/配下に収められます。

以下に CentOS7 での rsyslog の構成概要を示します。

なお、昔は imjournal ではなく imuxsock を使って journald の unix socket file 経由で受信していました。

また、Fedora では現在、rsyslog が標準インストールから外れており、基本は systemd-journald によって /var/log/journal 配下に保存、および TCP/UDPでリモート syslog サーバへ送信することになります。CentOS も今後はこの流れに沿うと思われます。

rsyslog.conf の基本設定例と見方

rsyslog.conf の設定は3つに分かれています。

#### MODULES ####

Load する Module を指定します。デフォルトでは imjournal と imuxsock が指定されていますが、imuxsock および /etc/rsyslog.d/listen.conf の設定は過去に使われていた名残で、無くても構いません。

なお、ファイルへの書き出しをする omfile 等のいくつかのOutput Module はビルトインとして初期組み込みされています。

UDP:514 での受信をしたいときは以下のように設定します。受信を制限したいときは "$AllowedSender UDP" で指定します。

$ModLoad imudp
$UDPServerRun 514
$AllowedSender UDP, 192.168.1.0/24, 172.16.1.1, 10.0.0.0/8, *.example.com

同様に TCP:514 での受信をしたいときは以下のように設定します。

$ModLoad imtcp
$InputTCPServerRun 514
$AllowedSender TCP, 192.168.1.0/24, 172.16.1.1, 10.0.0.0/8, *.example.com

#### GLOBAL DIRECTIVES ####

共通的な設定をここで指定します。

$ActionFileDefaultTemplate (Timestamp のフォーマット指定)

"$ActionFileDefaultTemplate" において、"RSYSLOG_TraditionalFileFormat" を指定していると "OCT 10 09:01:01" といった形式での表示になりますが、"RSYSLOG_FileFormat" に指定すると "2018-10-10T10:37:53.063083+09:00" といった秒以下の精度、タイムゾーン表示といった形式に変更できます。

$ActionFileDefaultTemplate RSYSLOG_FileFormat

$IncludeConfig (.conf ファイルのインクルード設定)

$IncludeConfig /etc/rsyslog.d/*.conf

上記設定 (デフォルト設定) により、rsyslog.conf 本体を変更することなく、設定追加が可能になります。/etc/rsyslog.d/example.conf といったファイルを新規作成し、その中に rsyslog の設定を加えるわけです。

$template (ホスト単位によるディレクトリ振り分け設定)

$template を使うとホスト単位でのディレクトリ振り分けも容易に実施することができます。

例えば以下のように設定を入れたとします。

$template SV-Group1, "/remote-log/%fromhost%/messages.log"

そして次の RULES の設定で

:fromhost-ip, startswith, "10.1.1."   -?SV-Group1
&stop

と指定すると、10.1.1.1 から来た syslog はどんな facility, level であっても "/remote-log/10.1.1.1/messages.log" に保存されますし、同様に 10.1.1.2 も "/remote-log/10.1.1.2/messages.log"  に保存されますし、3~254 も同様です。

&stop は、この直前の RULES に合致した場合は残りの RULES は無視して処理を終了する、という意味です。

%fromhost% は Property と呼ばれ、他には例えば以下のものが使えます。

  • msg = 受信した syslog メッセージ本文
  • hostname = syslog の送信ホストのホストネーム
  • fromhost = syslog の送信ホストの IP もしくは(逆引きが成功したら)ホスト名
  • fromhost-ip = syslog の送信ホストの IP (逆引きしない)
  • syslogtag = syslog tag (任意項目のため、tag が無いメッセージもある)
  • programname = ログを出力したプログラム (kernel, cron, systemd等)
  • pri = syslog の Priority
  • syslogfacility-text = syslog の Facility

なので例えば template で以下のように作れば

$template SV-Group1, "/remote-log/%fromhost%/%syslogfacility-text%.log"

ホスト毎かつファシリティ毎にファイルを分けることができるので便利です。

#### RULES ####

既に説明していますが、これは Input Module から受信したログを1行ずつ、どのように処理していくかを決める箇所です。

一般に 3 種類の RULE (フィルタ) があります。

Facility/Severity(Level)ベースのRULE(フィルタ)
[Facitlity].[Severity(Level)]    [出力先 or template]

といった形で Facility と Severity (Level) の値を評価します。(Priority と Severity をごっちゃにしているサイトも見られますが、RFC に倣えばこの分類があっているはずです)

例えばデフォルト設定の

*.info;mail.none;authpriv.none;cron.none /var/log/messages

は、『 "facility = 任意、severity = info 以上" かつ "facility = mail ではない(none)" かつ "facility = authpriv ではない" かつ "facility = cron ではない" syslog を受信したら /var/log/messages に出力する』、というルールです。

基本的には 1 つの処理が終わってもそこで終わりではなく、全てのルールを確認し、一致すれば複数の処理が行われることもあります。例えばデフォルト設定であっても、"facility = local1, Severity (Level) = emerg" の syslog が入ってきた場合は、上記の /var/log/messages にも合致しますが、以下のルールにも合致します。

*.emerg :omusrmsg:*

:omusrmsg: はユーザコンソールにメッセージを出す om (Output Module) です。このように指定すればデフォルトの :omfile: 以外の om を呼び出すことができます。

というわけで、facility=local1, Severity = emerg の場合は /var/log/messages にも記録するし、ユーザコンソールにも表示するのです。

なお、フィルターの次の行に "&stop" を指定すると、前述の通り、残りの処理をスキップします。

プロパティベースのRULE(フィルタ)
:[Property], [(!)CompareOperation], [Strings]   [出力先 or template]

といった形で syslog の Property を評価します。前述の通り、

:fromhost-ip, startswith, "10.1.1."   -?SV-Group1

といった RULE では [CompareOperation] として startswith が使われていますが、これは『送信元 IP が "10.1.1." で始まるもの』という意味になります。!startwith とした場合は 『送信元IPが "10.1.1." で始まらないもの』という意味になります。

なお、[出力先 or template] の - (ハイフン)は sync しない、という意味です。つまり、これを設定している場合は HDD への書き込みは直ちに行わないため、Disk IO 負荷が軽減されます。ログ出力が激しいものには効果的ですが、落雷などによる突然のシステム停止時にはHDDに残らないことになります。

式ベースのRULE(フィルタ)

例えば kernel が出力したログを別ファイルにしたい場合の書き方は以下になります。

if $programname == 'kernel' then {
   action(type="omfile" file="/var/log/kernel.log")
}

コメント

タイトルとURLをコピーしました