logrotate に関するメモ(2002/11/27)
各種アプリケーションから出力されるログを、条件に従ってログを分割・待避・圧縮する機能を持つものです。この logrotate は、Linux系のOSには標準でインストールされていますが、残念ながら Solaris にはインストールされていないのですぅー (>_<)
参考 : Apache の log を logrotateで
参考 : logrotateの不思議
最新の Solaris版 logrotateは、3.5.2 があるのですが、パッケージがSPARC版しかないのと、ソース からコンパイルできないので 2.6版をコンパイルして使用します。バージョンが低いですが、この版でも十分に使えます!
こまった時は : http://www.sunfreeware.com (ソース)
参考 : http://sdc.sun.com/solaris8/s8supported_prod_alphaL.html
あと、GNU-patch-2.5.4 のソースが必要ですので、事前に展開しておいてください。
1.logrotateのソースを展開し popt を再コンパイルします。
% cd /opt/local/src
% wget http://sunsite.compapp.dcu.ie/pub/sun/solaris-freeware/SOURCES/logrotate-2.6-solaris.tar.gz
% gzip -cd logrotate-2.6-solaris.tar.gz | tar xf -
% cd logrotate-2.6
% cd popt-1.1.1
% make clean
% make
% su
# make install
# exit2.本体をコンパイルしますが、SPARC版にカスタマイズされているので、若干修正します。
% cd /opt/local/src/logrotate-2.6
% vi Makefile
#RPM_OPT_FLAGS=-O2
RPM_OPT_FLAGS=-O3
#CFLAGS = -Wall -D_GNU_SOURCE -DVERSION=\"$(VERSION)\" $(RPM_OPT_FLAGS) -I./include
CFLAGS = -Wall -Dsparc -D_GNU_SOURCE -DVERSION=\"$(VERSION)\" $(RPM_OPT_FLAGS) -I./include -I/opt/local/src/patch-2.5.4
CC = gcc
% cp .depend .depend.old
% vi .depend
log.o: log.c \
/usr/include/stdarg.h \
/usr/include/stdio.h /usr/include/sys/feature_tests.h \
/usr/include/sys/va_list.h /usr/include/stdlib.h \
/usr/include/sys/time.h /usr/include/sys/types.h \
/usr/include/sys/isa_defs.h /usr/include/sys/machtypes.h \
/usr/include/sys/int_types.h /usr/include/sys/select.h \
/usr/include/time.h /usr/include/sys/siginfo.h \
/usr/include/sys/machsig.h /usr/include/unistd.h \
/usr/include/sys/unistd.h log.h
basenames.o: basenames.c /usr/include/stdlib.h \
/usr/include/sys/feature_tests.h /usr/include/string.h basenames.h
% make clean
% make
% su
# mkdir /usr/local/sbin/
# cp logrotate /usr/local/sbin/
# cp logrotate.conf /etc
# mkdir /etc/logrotate.d3.上記の修正で、私のところで作ったソース&バイナリー(logrotate-2.6-solx86.tar.gz)です。
/etc/logrotate.conf と /etc/logrotate.d/* を設置して、ログの監視を行いましょう。
logrotateの運用 : http://www.hi-ho.ne.jp/~miwakots/linux/logrotate.html
1./etc/logrotate.d ディレクトリ以下にあるファイルは、/etc/logrotate.conf に書かれている標準動作以外の処理を行いたい場合に設置します。このディレクトリの指定は、/etc/logrotate.conf に書かれている include 節に書きますが、ふつぅーは、「/etc/logrotate.d」と指定するようです。
logrotate.conf ファイルサンプル
2.Apacheのログ処理を、追加してみます。
# cd /etc/logrotate.d
# vi apache
/opt/local/apache/logs/access_log {
rotate 5
compress
size 1M
}3.cron による設定(ここでは、10分単位で設定してます)
# setenv EDITOR vi
# crontab -e
0,10,20,30,40,50 * * * * /usr/local/sbin/logrotate /etc/logrotate.conf 1> /dev/null★.注意点として、上記ローテイトを実行した場合、Apacheのログ出力先が(この場合、access_log)ローテイトによって変更されるため、ローテイト実行後は必ず、Apache の再起動が必要です。そうしないと、ログが書かれません!
sparc版のSolaris では、cron に /usr/lib/newsyslog が設定されていますが、実際 logrotate とやっている事は変わりないので logrotate だけで運用しても問題ありません。
logrotate では、必ずApacheの再起動が必要となりますが、Apache の機能でも実現可能です。
CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log.%Y%m%d 86400 540" combined %Y%m%d は、ローテイト時に access_log.YYYYMMDD といった形式でアクセスログを書いていきます。
86400 は、60(秒) * 60(分) * 24(時間) =1日 という意味です。
540 は、UTC からのオフセットであり。日本時間から -9時間引いた値となります。ですので日本時間で、00:00 となります。
※ オフセットを指定しない場合、Apache 起動経過時間からとなります。
ローカルゾーンのアクセスログを記述しないようにするのには、httpd.conf に以下の様に記述します。
SetEnvIf Remote_Addr 192.168.1. no_log
CustomLog /var/log/httpd/access_log common env=!no_log※ この設定で、192.168.1.0 〜 192.168.1.255 のIPからアクセスされたログは、記述されません。
ディレクトリの退避を行うのでしたら、下記の様なシェルスクリプトが便利です。
#!/usr/bin/sh
# filebackup ディレクトリの存在有無
if test -d /var/log
then
cd /var/log
if test -s abc.0.tgz
then
test -f abc.2.tgz && mv abc.2.tgz abc.3.tgz
test -f abc.1.tgz && mv abc.1.tgz abc.2.tgz
test -f abc.0.tgz && mv abc.0.tgz abc.1.tgz
fi
/usr/bin/tar cf - /var/log | /usr/bin/gzip > abc.0.tgz
fi
exit 0