月次アーカイブ: 8月 2008

ルーターやスイッチのsyslogをRHELなマシンのsyslog-ngで受け取るという要件があったので、練習がてらうちで実験してみました。うちにはsyslog飛ばせるマシンがなかったので、2組のサーバをCentOSで構築し、1台目のマシンのログを2台目のマシンへ飛ばすことでリハーサルとしました。

ログ受信側では、/var/log/syslog-ng ディレクトリの下に、IPアドレスとファシリティごとにログを取るようにします。

参考サイト
http://www.kuwazou.net/blog/cat21/syslogng/
http://d.hatena.ne.jp/ragtarou/20080505

■■ ログ送信側サーバ環境

[oresama@vh010 ~]$ cat /etc/redhat-release
CentOS release 4.6 (Final)

[oresama@vh010 ~]$ uname -a
Linux vh010.example.com 2.6.9-67.0.22.EL #1 Wed Jul 23 17:17:45 EDT 2008 i686 i686 i386 GNU/Linux

IPアドレスは 192.168.0.10

※ 今時点では、syslog-ngではなくsyslogdを使う

■■ ログ受信側サーバ環境

[oresama@vh020 ~]$ cat /etc/redhat-release
CentOS release 4.6 (Final)

[oresama@vh020 ~]$ uname -a
Linux vh020.example.com 2.6.9-67.0.22.EL #1 Wed Jul 23 17:17:45 EDT 2008 i686 i686 i386 GNU/Linux

IPアドレスは 192.168.0.20

■■ ログ送信側の設定

vh020 (192.168.0.20)へログを飛ばすには、syslog.confの末尾に一行
*.*                                                     @192.168.0.20
と追加し、syslogdを再起動するだけです。

[oresama@vh010 ~]$ sudo cp -p /etc/syslog.conf /etc/syslog.conf.orig
[oresama@vh010 ~]$ sudo vi /etc/syslog.conf

ここを
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

こうする
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
*.*                                                     @192.168.0.20

[oresama@vh010 ~]$ sudo /etc/init.d/syslog restart
Shutting down kernel logger:                               [  OK  ]
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
Starting kernel logger:                                    [  OK  ]

■■ ログ受信側にてsyslog-ng インストール

本日時点で最新のファイルを確認します。
http://rpm.pbone.net/index.php3?stat=26&dist=52&size=168335&name=syslog-ng-2.0.9-4.el5.i386.rpm

が、これだとglibcを最新にしないといけないので、el4対応の少しバージョンが下がったものをもってきます。
http://rpm.pbone.net/index.php3?stat=26&dist=42&size=157664&name=syslog-ng-2.0.9-3.el4.i386.rpm

[oresama@vh020 ~]$ wget ftp://ftp.pbone.net/mirror/ftp.silfreed.net/repo/rhel/4/i386/silfreednet/RPMS/syslog-ng-2.0.9-3.el4.i386.rpm

[oresama@vh020 ~]$ rpm --test -ivh syslog-ng-2.0.9-3.el4.i386.rpm
warning: syslog-ng-2.0.9-3.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
error: Failed dependencies:
        libevtlog.so.0 is needed by syslog-ng-2.0.9-3.el4.i386

libevtlog.so.0 がないって怒られた・・・。なので
http://rpm.pbone.net/index.php3/stat/4/idpl/3648483/com/eventlog-0.2.5-1.el4.i386.rpm.html
から libevtlog.so.0 を含む eventlog パッケージをもってきてインストールします。

[oresama@vh020 ~]$ wget ftp://ftp.pbone.net/mirror/ftp.silfreed.net/repo/rhel/4/i386/silfreednet/RPMS/eventlog-0.2.5-1.el4.i386.rpm

[oresama@vh020 ~]$ rpm --test -ivh eventlog-0.2.5-1.el4.i386.rpm
warning: eventlog-0.2.5-1.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
Preparing...                ########################################### [100%]
[oresama@vh020 ~]$ rpm --test -ivh eventlog-0.2.5-1.el4.i386.rpm syslog-ng-2.0.9-3.el4.i386.rpm
warning: eventlog-0.2.5-1.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
Preparing...                ########################################### [100%]

依存関係のエラーはなくなった(・∀・)!

[oresama@vh020 ~]$ sudo rpm -ivh syslog-ng-2.0.9-3.el4.i386.rpm eventlog-0.2.5-1.el4.i386.rpm
Password:
warning: syslog-ng-2.0.9-3.el4.i386.rpm: V3 DSA signature: NOKEY, key ID ed00d312
Preparing...                ########################################### [100%]
   1:eventlog               ########################################### [ 50%]
   2:syslog-ng              ########################################### [100%]

■■ syslog 自動起動設定を止める

[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog off
[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog --list
syslog          0:off   1:off   2:off   3:off   4:off   5:off   6:off

■■ syslog-ng 自動起動設定

[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog-ng on
[oresama@vh020 ~]$ sudo /sbin/chkconfig syslog-ng --list
syslog-ng       0:off   1:off
   2:on    3:on    4:on    5:on    6:off

■■ syslog-ng 設定

[oresama@vh020 ~]$ sudo cp -p /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.orig
[oresama@vh020 ~]$ sudo vi /etc/syslog-ng/syslog-ng.conf

ここを
source s_sys {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
    # udp(ip(0.0.0.0) port(514));
};

こうする
source s_sys {
    file ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
    # udp(ip(0.0.0.0) port(514));
};

#
# Remote logging
#
source s_remote {
        tcp(ip(0.0.0.0) port(514));
        udp(ip(0.0.0.0) port(514));
};

ここを
destination d_cons { file("/dev/console"); };
destination d_mesg { file("/var/log/messages"); };
destination d_auth { file("/var/log/secure"); };
destination d_mail { file("/var/log/maillog" sync(10)); };
destination d_spol { file("/var/log/spooler"); };
destination d_boot { file("/var/log/boot.log"); };
destination d_cron { file("/var/log/cron"); };
destination d_kern { file("/var/log/kern"); };
destination d_mlal { usertty("*"); };

こうする
destination d_cons { file("/dev/console"); };
destination d_mesg { file("/var/log/messages.$YEAR$MONTH$DAY"); };
destination d_auth { file("/var/log/secure.$YEAR$MONTH$DAY"); };
destination d_mail { file("/var/log/maillog.$YEAR$MONTH$DAY" sync(10)); };
destination d_spol { file("/var/log/spooler.$YEAR$MONTH$DAY"); };
destination d_boot { file("/var/log/boot.log.$YEAR$MONTH$DAY"); };
destination d_cron { file("/var/log/cron.$YEAR$MONTH$DAY"); };
destination d_kern { file("/var/log/kern.$YEAR$MONTH$DAY"); };
destination d_mlal { usertty("*"); };

destination d_separatedbyhosts {
        file("/var/log/syslog-ng/$HOST-$FACILITY-$YEAR$MONTH$DAY.log");
};

ここを
#log { source(s_sys); filter(f_kernel); destination(d_cons); };
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };

こうする
#log { source(s_sys); filter(f_kernel); destination(d_cons); };
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };
log { source(s_remote); destination(d_separatedbyhosts); };

■■ ログディレクトリ作成

[oresama@vh020 ~]$ sudo mkdir /var/log/syslog-ng

■■ syslog-ng 起動

[oresama@vh020 ~]$ sudo /etc/init.d/syslog-ng start
Starting syslog-ng:                                        [  OK  ]

■■ 自分自身のログが書き込まれているか確認する

[oresama@vh020 ~]$ logger -p local0.info -t test hogehoge
[oresama@vh020 ~]$ sudo tail -f /var/log/messages.20080830
Aug 30 20:48:52 vh020 syslog-ng: syslog-ng startup succeeded
Aug 30 20:50:10 vh020 test: hogehoge

書き込まれていた

■■ 他ホストからログが書き込まれているか確認する

[oresama@vh020 ~]$ cd /var/log/syslog-ng/
[oresama@vh020 syslog-ng]$ ll
total 32
-rw-------  1 root root  856 Aug 30 22:25 192.168.0.10-auth-20080830.log
-rw-------  1 root root 1069 Aug 30 22:22 192.168.0.10-authpriv-20080830.log
-rw-------  1 root root  422 Aug 30 22:24 192.168.0.10-cron-20080830.log
-rw-------  1 root root  652 Aug 30 21:00 192.168.0.10-daemon-20080830.log
-rw-------  1 root root  219 Aug 30 20:54 192.168.0.10-kern-20080830.log
-rw-------  1 root root  356 Aug 30 20:55 192.168.0.10-local7-20080830.log
-rw-------  1 root root  705 Aug 30 20:55 192.168.0.10-mail-20080830.log
-rw-------  1 root root  103 Aug 30 20:54 192.168.0.10-syslog-20080830.log

書き込まれている

[oresama@vh020 syslog-ng]$ sudo cat 192.168.0.10-auth-20080830.log
Aug 30 20:54:49 192.168.0.10 su(pam_unix)[2258]: session closed for user root
Aug 30 20:54:54 192.168.0.10 sshd(pam_unix)[2339]: session opened for user oresama by (uid=0)
Aug 30 20:54:56 192.168.0.10 sshd(pam_unix)[2339]: session closed for user oresama
Aug 30 20:55:15 192.168.0.10 su(pam_unix)[2380]: session opened for user root by oresama(uid=0)
Aug 30 20:56:54 192.168.0.10 su(pam_unix)[2380]: session closed for user root
Aug 30 20:57:26 192.168.0.10 su(pam_unix)[2430]: session opened for user root by oresama(uid=0)
Aug 30 22:21:49 192.168.0.10 su(pam_unix)[2430]: session closed for user root
Aug 30 22:21:50 192.168.0.10 sshd(pam_unix)[2170]: session closed for user oresama
Aug 30 22:22:49 192.168.0.10 sshd(pam_unix)[2502]: session opened for user oresama by (uid=0)
Aug 30 22:25:41 192.168.0.10 sshd(pam_unix)[2502]: session closed for user oresama

■■ logrotateの設定変更

■ /etc/logrotate.d/syslog の設定削除

syslogのローテーションが不要になるので、/etc/logrotate.d/syslog の設定を削除します。

[oresama@vh020 ~]$ cd /etc/logrotate.d
[oresama@vh020 logrotate.d]$ sudo rm -f syslog

※ なぜならsyslog-ngが日付ごとのログを吐くからです

■ 前日のログを圧縮する

syslog-ngで日付ごとのログをとっているのですが、これだけだと圧縮されないので、ログ圧縮のスクリプトを書いてあげます。bashのスクリプトで配列変数を使うのは久しぶりなので、ちょっとだけド忘れしてました(^^;
bashで配列変数を使うときには、
ほにゃらら[0]=~~~
ほにゃらら[1]=~~~
ほにゃらら[2]=~~~
と変数を作ってやり、これらの変数をまとめて使うには
${ほにゃらら[@]}
としてやります。決して
$ほにゃらら[@]
ではありません。

[oresama@vh020 ~]$ sudo vi /root/bin/logrotate
[oresama@vh020 ~]$ sudo chmod 700 /root/bin/logrotate
#!/bin/sh

### FOR local logs
cd /var/log
LOG[0]=boot.log
LOG[1]=cron
LOG[2]=maillog
LOG[3]=messages
LOG[4]=secure
Y=`date +%Y%m%d --date='1days ago'`
for l in `echo ${LOG[@]}`
do
if [ -f $l.$Y ];
    then
        gzip $l.$Y
fi
done

### FOR remote logs
cd /var/log/syslog-ng
LOGS=`ls * | grep $Y | grep -v .gz$`
for n in `echo $LOGS`
do
if [ -n $f ];
    then
        gzip $n
fi
done

あとはこのスクリプトを1日1回、適当なタイミングでcronに登録してやればOKです。
以上です。

ね、簡単でしょ?

あるテストツールをブン回しているときのCPU使用率とメモリ使用率を算出したいと言われまして、時刻とCPU使用率とメモリ使用率を出すスクリプトを書きました。計測結果は1時間ごとのログを取るようにしています。参考にしたページはココココです。

#!/bin/sh
LANG=C
while true
do
    top -n 1 -b -d 1 | grep ^Cpu |
    sed -e "s/^/`date`t/g;s/$/tmemory free is `free -t |
    grep -i ^total | awk '{print int( (1-($3/$2))*100 )}'`%/g" >> `date +%Y%m%d-%H`.log
    sleep 1
done

今回のスクリプトは単純にtopコマンドとfreeコマンドの結果を同じ1行に出力したいと思ったわけで作成したのです。整形の部分はsedコマンドが大活躍ですね。topコマンドですが、そのまま実行するにはちょっと不都合です。なので、繰り返し回数を-nオプションで指定します。秒間1回ずつの出力をしたいので、-nオプションの引数に1を与えて、1回ずつの出力をwhile文で繰り返すことにしました。そして、CPU使用率の出力をsedコマンドで置換し、行頭に日付を、行末にメモリ使用量をつけくわえます。日付、CPU使用率、メモリ使用率の各項目はTABで区切ってやることにしました。

topコマンドの出力結果ですが、これはサマリーエリアに表示されているCPU使用率の部分をgrepで切り出しています。左から、ユーザプロセスの使用時間が1%、システムプロセスの使用時間が1%、実行優先度を変更したユーザプロセスの使用時間が0%、アイドル状態の時間が98%、I/Oの終了待をしている時間、ハードウェア割込み要求での使用時間、ソフトウェア割込み要求での使用時間がそれぞれ0%となっています。つまり、CPUの空きは98%ということになります。

Cpu(s):  1.0% us,  1.0% sy,  0.0% ni, 98.0% id,  0.0% wa,  0.0% hi,  0.0% si

freeコマンドの出力結果ですが、-tオプションをつけることで、実メモリとswapとの合計を出すことにしました。この出力結果のTotalで始まる行がそれです。その後の

awk '{print int( (1-($3/$2))*100 )}'

の部分で、メモリの空き領域をメモリ容量合計で割った結果を百分率の形に計算しています。ほんとに簡単な負荷計測ツールとして使うには、これでいいんじゃないかなー・・・と思います。