logrotate (Log file rotation)

[ 戻る | トップページに戻る ]

概要

logrotate とは、各種ログファイルを一定のルールに従ってローテーションさせる ためのツール。

URL

ftp://ftp.tokyonet.ad.jp/.da1/linux/redhat/code/logrotate/

インストール環境

Slackware 7.0 (Kernel 2.2.17 + glibc 2.1.2)
Solaris 2.6

必要なもの

popt

バージョン

3.3, 3.5.2

インストール手順 (for Linux)

$ tar xvfz logrotate-3.3.tar.gz
$ cd logrotate-3.3
$ make
$ su
# make install
# cp ./examples/logrotate-default /etc/logrotate.conf
# exit

/etc/logrotate.conf を必要に応じて修正する。 詳しくは man logrotate.
最後に logrotate を cron 等で定期的に実行されるようにすればおしまい。 crontab への設定例は以下の通り。
0 0 1 * * /usr/sbin/logrotate /etc/logrotate.conf

インストール手順 (for Solaris)

$ tar xvfz logrotate-3.5.2.tar.gz
$ cd logrotate-3.5.2
$ make
cc -E -Wall -D_GNU_SOURCE -DVERSION=\"3.5.2\"  -g -M logrotate.c log.c config.c basenames.c  > .depend
/bin/sh: cc: コマンドが見つかりません。
make: *** [depend] Error 1

むー。ソース (Makefile) を見ても CC を設定するところがない。 しょーがないので、引数として指定する。
$ make CC=gcc
gcc -Wall -D_GNU_SOURCE -DVERSION=\"3.5.2\"  -g   -c logrotate.c -o logrotate.o
logrotate.c:6: getopt.h: ファイルもディレクトリもありません。
logrotate.c:7: popt.h: ファイルもディレクトリもありません。
make: *** [logrotate.o] Error 1

むむむ。調べてみると、どうやら popt を入れる必要があるらしい。popt のインストール後、再トライ。

ダメ。現象変わらず。 調べると Solaris では getopt は stdlib.h に含まれるとのことなので、 ソースから #include をコメントアウトして、再トライ。
$ make CC=gcc
(snip)
gcc -g  logrotate.o log.o config.o basenames.o -lpopt  -o logrotate
未定義の                        最初に参照している
シンボル                            ファイル
isblank                             config.o
ld: 重大なエラー: シンボル参照エラー。logrotate に書き込まれる出力はありません
collect2: ld returned 1 exit status
make: *** [logrotate]

ふにゃ〜。今度は isblank() かぁ。 またまた調べてみると、Solaris には isblank() はないので isspace() に置き換える、という情報を見付けた。 そこで、config.c 内の isblank() をすべて isspace() に置き換えてから再トライ。
$ make CC=gcc
(snip)
config.c:587: warning: subscript has type `char'
config.c:600: warning: subscript has type `char'
config.c:667: warning: subscript has type `char'
config.c:791: warning: subscript has type `char'
gcc -g  logrotate.o log.o config.o basenames.o -lpopt  -o logrotate

とりあえず出来た。では、インストール。
$ su
# make install

では、いよいよ /etc/logrotate.conf を作成して実行。
# /usr/local/sbin/logrotate /etc/logrotate.conf
error: /etc/logrotate.conf:5 unexpected text
error: /etc/logrotate.conf:6 unexpected text
error: /etc/logrotate.conf:7 unexpected text
error: /etc/logrotate.conf:8 unexpected text
error: /etc/logrotate.conf:9 unexpected text
error: /etc/logrotate.conf:10 unexpected text
error: /etc/logrotate.conf:11 unexpected log filename

むむ。ソースを見ると、isspace() に変えた所が問題になっているらしい。 以下、config.c の該当行。
            while (isspace(*start)) start++;

            if (*start != '\n') {
                message(MESS_ERROR, "%s:%d unexpected text\n", configFile,
                            lineNum);
                while (*start != '\n') start++;
            }

な〜にぃ〜。isblank で読み飛ばした後に '\n' を期待しているにも関わらず、 isspace() では ' ' も '\t' も '\n' も True 〜。
isspace() を使うのをやめて、以下のようなマクロを config.c の頭で定義して、 こっちを使うようにする。
#ifndef isblank
# define isblank(c)	((c) == ' ' || (c) == '\t')
#endif

コンパイルからやり直し。
# exit
$ make clean
$ make
$ su
# make install (適宜手動で)
# ./logrotate /etc/logrotate.conf
error: error creating state file /var/lib/logrotate.status: No such file or directory

ありゃ。自動では作ってくれないのね。
# mkdir -p /var/lib
# touch /var/lib/logrotate.status
# ./logrotate /etc/logrotate.conf
error: error reading top line of /var/lib/logrotate.status

/var/lib/logrotate.status の先頭に以下の行を挿入。
logrotate state -- version 1

これにて、ようやくおしまい〜。

[ 戻る | トップページに戻る ]