2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

logrotateの不思議!

logrotateとは、結構聞くが何をするサービスか?解らない方も多いと思う。これは、各種logをローテーションさせるサービスである。つまり、logはほっておくと肥大化する。それを、定期的に分割、バックアップする機能である。しかし、この機能がどのように動いているのか不思議に思ったのは小生だけであろうか?もちろん、定期的にバックアップしているため、cronが介在していることは言うまでもない。ここでは、logrotateの仕組みを理解してみたい。

■ logrotationがなぜ必要なのか(個人的な見解)
logって当然肥大化するよね。大きくなったlogは消すか、分割するかしないと永遠に大きくなり続けるだろう。
俺はこういう考えを持っている。LinuxとかFreeBSDとかUnix系OSをインストールするときにファイルのボリュームを刻む作業がある。ここで俺が良くやるのは、swapと /boot と / 領域しか作らない。このときに少々問題が起きる可能性がある。それは、 / 領域だ。/ 領域を細かなボリュームに刻まないと、例えば気が付かないうちにボリュームを圧迫してるファイルが存在していたとしても、そのファイルを特定することが困難になる。多分、自然にふくらんでいくファイルなどlog程度しか考えられないが、しかしクラックな方たちの攻撃に任意のファイルを肥大化させディスクの圧迫を狙った攻撃がある。それすら確信がつかめないのである。もちろん、 /var 、 /home 、 /usr と細かなスライスにするのが正しいが、logの肥大化対策と言うことを考えるとlogrotationは“アプリケーションパッケージを増やしたら必ずlogが存在するからlogrotationを考慮しよう!”と言うのが正解なのではないか。結構見失いがちなので改めて考えてみよう。


1.logrotateの役割

logrotateは、前述したようにlogを毎日、毎週、毎月、日付もしくはナンバーをつけてバックアップしていく機能である。通常では、logファイルは放っておくと肥大化して扱いにくくなる。それを回避するためにも大切な機能といえる。サーバのモジュールには個別にlogをローテーションしてくれる機能を搭載しているものもある。しかし、logrotateで一元的に管理するのも便利ではないかと思う。


2.logrotateはどのように動いてるのか?

最初、小生はこのlogrotateはどのように動いてるのか?疑問であった。それが、解ったので解説してみたい。では、logrotateはどのように動いているのかみてみよう!まず、スケジューリングしていると言うことはcronで起動をかけてることは、間違いない。と言うことでcrontabの内容を見てみよう。

# more /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts 01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

何も追加設定してなければ、このような内容だと思います。この中でlogrotateは/etc/cron.dailyの指定で起動がかかる。では、次に/etc/cron.dailyのディレクトリを参照してみよう。

# ls -al /etc/cron.daily

total 32
drwxr-xr-x 2 root root 4096 Nov 29 04:02 .
drwxr-xr-x 41 root root 4096 Dec 1 10:58 ..
-rwxr-xr-x 1 root root 276 Apr 4 2001 0anacron
-rwxr-xr-x 1 root root 51 Jan 5 2001 logrotate
-rwxr-xr-x 1 root root 402 Jul 3 21:49 makewhatis.cron
-rwxr-xr-x 1 root root 132 Feb 27 2001 slocate.cron
-rwxr-xr-x 1 root root 93 Apr 9 2001 sysstat
-rwxr-xr-x 1 root root 244 Mar 30 2001 tmpwatch

これを見るとlogrotateと言う、シェルがあります。内容を見てみましょう。

# more /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf

これを見るとlogrotateコマンドがlogrotate.confを参照してるようです。では、logrotate.confを見てみましょう。

# more /etc/logrotate.conf
# see “man logrotate” for details
# rotate log files weekly

weekly               ← 指定がない限りweeklyにローテーション

# keep 4 weeks worth of backlogs rotate 4
# send errors to root errors root
# create new (empty) log files after rotating old ones create
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory

include /etc/logrotate.d  ← ローテーションファイルの格納場所をインクルード

# no packages own lastlog or wtmp — we’ll rotate them here

/var/log/wtmp
{
monthly
create 0664
root utmp
rotate 1
}

これを見ると、include /etc/logrotate.dがローテーションファイルの格納場所のようです。それでは、今度/etc/logrotate.dディレクトリをのぞいてみましょう。

# ls -al /etc/logrotate.d
total 20
drwxr-xr-x 2 root root 4096 Nov 28 19:25 .
drwxr-xr-x 41 root root 4096 Dec 1 10:58 ..
-rw-r–r– 1 root root 78 Mar 30 2001 ftpd
-rw-r–r– 1 root root 145 Apr 3 2001 linuxconf
-rw-r–r– 1 root root 763 Feb 8 2001 syslog

ローテーション定義ファイルがありました。つまり、logrotate.confでincludeされたディレクトリに個々のモジュールのlogrotate定義ファイルがあると言うことです。参考までに、この中のsyslogファイルの内容を見てみましょう。

# cd /etc/logrotate.d
# more syslog

/var/log/messages
{
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

/var/log/secure
{
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

/var/log/maillog
{
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

/var/log/spooler
{
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

/var/log/boot.log
{
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

/var/log/cron
{
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}

logrotateの実体が出てきました。この内容は、例えば一番上のmessages logをローテーションしてsyslogdサービスにシグナルを与えて再起動しています。同じことを別のlogファイルに以降行っています。と言うことでかなりややこしいですが、最終的にはこのような個々のファイルでローテーションを管理しています。


3.logrotateファイルの書き方

では、ローテーションを追加したい場合はどうしたらいいか?以下で説明します。ローテーションファイルは必ず、/etc/logrotate.dディレクトリの中に入れます。例えば、Apacheのaccess_logとerror_logをローテーションしたい場合は、以下のように記述して、/etc/logrotate.dディレクトリに置きます。
以下は、一例を示す。

# vi apache
/usr/local/apache/logs/access_log /usr/local/apache/logs/error_log
{
rotate 6
size=100k
missingok
daily
sharedscripts
postrotate
/bin/killall -HUP `cat /usr/local/apache/logs/httpd.pid 2>/dev/null` 2> /dev/null
endscript
}

こんな具合に、書いて保存しておけばApacheのログローテーションが行われる。

■ 上のapache logrotateファイルの中身の説明

rotate 6          6つのファイルに分割する。
size=100k         保存サイズは100kだよ。
missingok
         ログファイルがないときは、勝手に次の処理を行う(このパラメータが無いディストリビューション有り)。
daily             毎日rotatetionな作業を行う。
sharedscripts       postrotateで指定するスクリプト(ここで言うkillallスクリプト)はlogに関係なく一度しか実行しない。
postrotate         endscriptまでの間のスクリプトを実行する。

■ その他のパラメータ

compress            圧縮する(gz形式)。
nocompress          圧縮しない。
create 0660 root users  ファイル分割を行った時にCreateされるファイルのパーミッション&オーナー&グループ

但し、Apacheの場合はApacheの機能としてaccess_logのローテーション機能もあるので、どちらを使っても良いだろう(httpd.confのCustomLogセクションで設定する)。

以上

コメント