ルーターやスイッチの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です。
以上です。
ね、簡単でしょ?