LogWatchで独自のログを収集させるには
LogWatchで独自のログを収集させるための設定を解説するために、
ここでは、以下のようなログ(以降、Exampleログ とします)を例として、解説してみます。
[2013-04-24 20:27:19] http://server-setting.info/blog/unixbench-kvm-vps.html xxxxxxxx
[2013-04-24 20:54:10] http://server-setting.info/centos/logwatch-nginx-setting.html yyyyyyy
...
|
ここでは、ログの例として、上記のようなログファイルがあるとします。
このログ情報は、以下の3つの情報からなります。
[2013-04-24 20:27:19] http://server-setting.info/blog/unixbench-kvm-vps.html xxxxxxxx
|
このログファイルは、 /var/log/example.log に保存され、Logrotate で /var/log/example.log.1.gz のように保存されていくものとします。
LogWatchで独自のログを収集させるためには、3つのファイルを作成する必要があります。
以降、3つのファイルについて解説します。
Exampleログ のスクリプトファイルを定義します
# LogWatchで出力される際のタイトルを設定します。
Title = Example Log
# ログファイルのグループ名を設定します。
# この名前で、.../conf/logfiles/example-log.conf が決定します。
LogFile = example-log
|
Exampleログ のログファイルを定義します
# ログファイルのパスを設定します
LogFile = /var/log/example.log
# ログファイルのアーカイブパスを設定します
Archive = /var/log/example.log.*.gz
|
Exampleログ のスクリプトファイルを作成します
#!/usr/bin/perl
# Logwatch の dates の使用宣言を行います。
use Logwatch ':dates';
# ログファイルに出力される日付フォーマットを指定します。
$sdate = TimeFilter("%Y-%m-%d");
# ログファイルを1行づつ読み込み処理します。
while (defined($line = <STDIN>)) {
# 同じ日付なら、ログ情報を出力します。
if ($line =~ /^\[$sdate/) {
print $line;
}
}
|
上記のスクリプトは、同じ日付のログ情報を選別して、LogWatchへ出力する単純なスクリプトです。
LogWatchのスクリプトは、通常、perlで記述することが多いです。それは、LogWatchが、perlのためのLogWatch専用モジュールを提供しているからもであります。
ただ、上記のとおり便利ではありますが、perlで記述しなければならないわけではありません。以下は、上記と同じ処理を bash (B-シェル)で記述した例です。
#!/usr/bin/env bash
# 1行の分割キーワードを設定します。
OLD_IFS=$IFS
IFS=$'\n'
# LogWatchの日付範囲パラメータから、ログ収集する日付情報を編集します。
rm_date=''
if [[ "$LOGWATCH_DATE_RANGE" =~ "today" ]]; then
rm_date=`date '+%Y-%m-%d '`
elif [[ "$LOGWATCH_DATE_RANGE" =~ "yesterday" ]]; then
rm_date=`date --date '1 days ago' '+%Y-%m-%d '`
else
rm_date=''
fi
# ログファイルを1行づつ読み込み処理します。
for LINE in $( cat /dev/stdin ); do
# 同じ日付なら、ログ情報を出力します。
if echo $LINE|egrep "^\[$rm_date" &> /dev/null; then
echo $LINE
fi
done
# 1行の分割キーワードを元に戻します。
IFS=$OLD_IFS
|
bash でスクリプトを記述する場合は、以下の環境変数にLogWatchのパラメータ情報が設定されています。
- $LOGWATCH_DATE_RANGE : Date Range(日付範囲)
- $LOGWATCH_DETAIL_LEVEL : Detail Level(詳細レベル)
- $LOGWATCH_TEMP_DIR : Temp Dir(一時ディレクトリ)
- $LOGWATCH_DEBUG : Debug Level(デバッグレベル)
LogWatchで独自のログを収集させてみる(テスト)
先に設定した独自ログの収集を、簡単にLogWatchで動作確認してみましょう。
$ logwatch --print --service example-log --range yesterday
$ logwatch --output stdout --service example-log --range yesterday
Processing Initiated: Thu Apr 25 05:05:09 2013
Date Range Processed: yesterday
( 2013-Apr-24 )
Period is day.
Detail Level of Output: 0
Type of Output: unformatted
Logfiles for Host: db9.rise43.com
--------------------- Example Log Begin ------------------------
[2013-04-24 20:27:19] http://server-setting.info/blog/unixbench-kvm-vps.html xxxxxxxx
[2013-04-24 20:54:10] http://server-setting.info/centos/logwatch-nginx-setting.html yyyyyyy
---------------------- Example Log End -------------------------
|
こんな感じで出力されればOKです。
一応、コマンドについて解説しておきます。
$ logwatch --help
Usage: /usr/sbin/logwatch [--detail ] [--logfile ] [--output ]
[--format ] [--encode ] [--numeric]
[--mailto ] [--archives] [--range ] [--debug ]
[--filename ] [--help|--usage] [--version] [--service ]
[--hostformat ] [--hostlimit ] [--html_wrap ]
--detail : Report Detail Level - High, Med, Low or any
--logfile : *Name of a logfile definition to report on.
--logdir : Name of default directory where logs are stored.
--service : *Name of a service definition to report on.
--output
--format : Report Format - text [default], html.
--encode : Enconding to use - none [default], base64.
--mailto : Mail report to .
--archives: Use archived log files too.
--filename : Used to specify they filename to save to. --filename [Forces output to file].
--range : Date range: Yesterday, Today, All, Help
where help will describe additional options
--numeric: Display addresses numerically rather than symbolically and numerically
(saves a nameserver address-to-name lookup).
--debug : Debug Level - High, Med, Low or any
--hostformat: Host Based Report Options - none [default], split, splitmail.
--hostlimit: Limit report to hostname - host1,host2.
--html_wrap : Default is 80.
--version: Displays current version.
--help: This message.
--usage: Same as --help.
* = Switch can be specified multiple times...
|
とりあえずテストなので、最小限のオプションを指定しています。
ここで設定して例は、非常に基本的な事項のみです。必要に応じて、その他の設定事項も必要になるかと思います。
また、ログ情報収集のスクリプトも一番簡単なもので、日付情報のみを確認しているだけです。これも必要に応じていろんなことができると思います。
本来、ログファイルは、何か異常を検出するための情報です。
その情報をリアルタイムに見ていれば、異常の検知も早く、問題が拡大しない内に対処できると思いますが、複数のサーバーを管理している場合には、全てのサーバーをリアルタイムにウォッチするというわけにもいきません。
そういうとき、
上記のように必要なログ情報を個人で採取し、そのログ情報を1日1回メール配信してくれるLogWatchの処理にはめ込んでおくと、
毎日、メールをチェックすることで、大まかなシステムの異常を確認することができるようになると思います。
LogWatch以外にもシステム異常をモニターする
Monitを使ってApacheを監視する(1) で記事にした Monitなどもあります。
このような異常検知のシステムを動作させていることがセキュリティの強化につながることは間違いありません。
まずは、導入をおすすめします。
コメントを投稿 :