タグ・アーカイブ: syslog-ng

ルーターやスイッチの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です。
以上です。

ね、簡単でしょ?