UNIX系OSのシステムロギングをおよそ20年の長きにわたって支えてきた「syslogd」にも、限界が見えつつあります。その限界を打ち破る機能を備えた新しいシスログデーモンを紹介します。(編集部)
前回「syslog-ngの導入と設定」で紹介したsyslog-ngの導入方法に続き、今回はその活用方法を紹介します。
syslog-ngでは、設定ファイルにマクロやテンプレートを使うことができます。マクロを使ってログのファイル名に日時を付加したり、テンプレートを使ってログの内容を自由に組み立てることができます。
またフィルタを設定することで、特定のメッセージを検出することができます。外部プログラムと組み合わせてメールを自動的に送信したり、不正アクセスを制限することも可能です。今回はそうしたsyslog-ngの活用方法を解説します。
【注意】
以降はrootユーザーにて作業を行います。Ubuntuのようにrootユーザーが直接使用できない場合には、sudoコマンドを使用します。作業に当たって、第2回「syslog-ngの導入と設定」で紹介している基本的な設定方法を習得しておく必要があります。今回は設定ファイルの解説に終始しています。設定ファイルを有効にするための再起動の方法などは、第2回を参考にしてください。
syslog-ngでは設定ファイル「syslog-ng.conf」にマクロを用いることができます。マクロで指定された個所は、あらかじめ定義された規則に従って置換されます。
例えばログファイル「/var/log/messages」の名前に日付を付加するには、次のように「$YEAR」「$MONTH」「$DAY」といったマクロを使います。
source s_1 { file ("/proc/kmsg" log_prefix("kernel: ")); unix-stream ("/dev/log"); internal(); }; filter f_1 { level(info..emerg) and not facility(mail,authpriv,cron); }; #destination d_1 { file("/var/log/messages" ); }; #これを日付単位で出力した場合 destination d_1 { file("/var/log/messages_$YEAR$MONTH$DAY"); }; log { source(s_1); filter(f_1); destination(d_1); };
上のようなマクロを使った場合、「/var/log/messages_20080909」のようなログファイルが生成されます。これを使ってログファイルを日付ごとに整理できます。次の設定では、ディレクトリ名の指定に日付マクロを使用し、月ごとにディレクトリを作成し、さらにその中に日ごとにログファイルを作成しています。
なお、ディレクトリを自動的に生成するには「create_dirs(yes)」オプションの指定が必要です。
destination d_1 { file("/var/log/$YEAR.$MONTH/messages_$DAY" create_dirs(yes)); }; ※「/var/log/年.月」ディレクトリを作成し、その下に「messages_日」をファイル名としたログを生成します。
ログを集中して管理するシスログサーバは、さまざまなネットワーク機器やサーバからのログを受け取ります。そのため、次のように「$HOST」を使って、機器ごとにログファイルを整理するようにすると便利です。その際「$PROGRAM」を使えば、ログを出力しているプログラム名を付加し、より見分けやすくできます。
destination d_1 { file("/var/log/$HOST/$YEAR-$MONTH/$PROGRAM-$DAY.log" create_dirs(yes)); }; ※「/var/log/ホスト名」ディレクトリを作成し、その下に「年-月」でディレクトリを作成し、さらに「プログラム名-日.log」をファイル名にログを生成します。
以上のようにマクロを使用すれば、logrotateのようなプログラムを別途使用することなく、ログファイルのローテーションが可能になります。ただし、ログファイルを柔軟に生成することはできますが、例えば「7日前のファイルを削除する」といった世代管理はできません。
syslog-ngで使用できる主なマクロは表1のとおりです。
マクロには「S_」で始まるものと「R_」で始まるものがあり(例:S_DATE,R_DATE)、デフォルトでは「S_」が使用されます。「S_」はログが生成されたとき、「R_」はログを受け取った日時を基に、日付を算出します。
ローカルホストで生成されるログなら、「S_」も「R_」も日時に大きなズレは発生しませんが、リモートホストからのログを収集する場合、通信経路の混雑など何らかの理由で、ログの受け取りが遅れる場合があります。その場合には「S_」と「R_」を区別する必要があります。「R_」で始まるマクロをデフォルトで使用する場合は、syslog-ng.confのグローバルオプションに「use_time_recvd (yes)」を指定します。
options { sync (0); time_reopen (10); log_fifo_size (1000); ...省略... use_time_recvd (yes); };
またマクロでは使用法によっては、悪意のあるログメッセージを送り込んで、意図しないファイルやディレクトリを生成することも可能となってしまいます。マクロを使用する際は、慎重に設定を行います。
マクロ | 説明 |
---|---|
$FACILITY | ログのファシリティ |
$PRIORITY | ログのプライオリティ |
$DATE ($R_DATE, $S_DATE) | BSD-syslog形式の日付 (例:Sep 13 15:58:00) |
$FULLDATE ($R_FULLDATE,$S_FULLDATE) | $DATEに年を加えたもの (例:2008 Sep 13 15:58:00) |
$ISODATE ($R_ISODATE, $S_ISODATE) | ISO8601の日付 (例:2008-09-13T15:58:00.123+01:00) |
$STAMP ($R_STAMP, $S_STAMP) | ts_format()オプションで指定された 形式の日付 |
$YEAR ($R_YEAR, $S_YEAR) | 年 |
$MONTH ($R_MONTH, $S_MONTH) | 月 |
$DAY ($R_DAY, $S_DAY) | 日 |
$WEEKDAY ($R_WEEKDAY,$S_WEEKDAY) | 曜日(例:Sun) |
$WEEK ($R_WEEK, $S_WEEK) | 年の第何週 |
$HOUR ($R_HOUR, $S_HOUR) | 時間 |
$MIN ($R_MIN, $S_MIN) | 分 |
$SEC ($R_SEC, $S_SEC) | 秒 |
$UNIXTIME ($R_UNIXTIME,$S_UNIXTIME) | UNIXタイム(1970-01-01T00:00:00からの秒数) |
$TZOFFSET ($R_TZOFFSET,$S_TZOFFSET) | GMTとの時差(例:+09:00) |
$TZ ($R_TZ,$S_TZ) | $TZOFFSETと同等 |
$HOST | ログを出力したホスト |
$FULLHOST | ログを出力したホスト(FQDN) |
$HOST_FROM | ログを転送したホスト |
$FULLHOST_FROM | ログを転送したホスト(FQDN) |
$SOURCEIP | ログを転送したホストのIPアドレス |
$PROGRAM | ログを出力したプログラム |
$PID | ログを出力したプログラムのPID |
$MSG/$MESSAGE | $PROGRAMや$PIDを含んだログメッセージ |
$MSGONLY | ログメッセージから$PROGRAMや$PIDを除いたもの |
表1 syslog-ng.confで使用可能なマクロ ※本文のとおり、マクロには「S_」で始まるログが生成された日時に基づくものと、「R_」で始まるログを受け取った日時に基づくものがあります(例:S_DATE,R_DATE)。デフォルトでは「S_」が使用されます。 |
Copyright © ITmedia, Inc. All Rights Reserved.