logrotate に関するメモ(2002/11/27) 
 

logrotateとは

各種アプリケーションから出力されるログを、条件に従ってログを分割・待避・圧縮する機能を持つものです。この logrotate は、Linux系のOSには標準でインストールされていますが、残念ながら Solaris にはインストールされていないのですぅー (>_<)

  参考 : Apache の log を logrotateで

  参考 : 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
# exit

2.本体をコンパイルしますが、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.d

3.上記の修正で、私のところで作ったソース&バイナリー(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 だけで運用しても問題ありません。

特記事項(Apache機能のローテイトを使用する)

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