syslogで溜まったログをローテーションさせる

サーバで動くデーモン等はログを吐きます。
ほんとに大量のログを吐くやつもいますよね(w

自分でツールを作った時にでもログは出力させるように作るのは
デバッグ情報としても、動作確認のために必要ですよね^^

そうするとやっぱりログは増えます。モリモリ溜まります(w
だからローテーションさせる必要があります。
次々に溜まるログを古いログを捨て、
新しいものを残していきます。

このローテーションの仕組みを自分で作るのは大変そうf^^;
ということでlogrotateの出番です(゚∀゚ )

logrotateを起動するcronさん

logrotateはsystemのcronにログをローテーションさせるものです。
systemのcronの設定とは/etc/crontabに書かれています。

$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
08 * * * * root run-parts /etc/cron.hourly
09 4 * * * root run-parts /etc/cron.daily
29 4 * * 0 root run-parts /etc/cron.weekly
49 4 1 * * root run-parts /etc/cron.monthly

これを見てわかるようにcronによって毎時間、毎日、毎週、毎月という
間隔でいろんなジョブを実行するように設定されています。
logrotateはこのcronの毎日実行の中にあります。

$ cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

スクリプトの中身はかなりシンプル~
ログローテーションを試みて、失敗すればsyslogに一言残す感じ。

毎日実行されているcronの時間を見ると4時9分!
ちょうどsyslogによってローテーションされたログを見ると、
過去のログのタイムスタンプは4時9分( ゚Д゚)

$ l /var/log/maillog*
-rw------- 1 root root 3360 Sep 29 04:09 /var/log/maillog
-rw------- 1 root root 5873 Sep 25 04:09 /var/log/maillog.1
-rw------- 1 root root 5877 Sep 18 04:09 /var/log/maillog.2
-rw------- 1 root root 5875 Sep 11 04:09 /var/log/maillog.3
-rw------- 1 root root 5875 Sep  4 04:09 /var/log/maillog.4
~~~~~

ということでcronさんの毎日のお勤めによって
logrotateが起動されてログの入れ替えをしてくれています^^)b

logrotateの設定

ちょっと話が反れましたがlogrotateの設定について説明します^^
わかりやすいのがsyslogで保存されているログをローテーションですよね。

syslogでローテーションされている設定は以下です。

$ cat /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

見てわかるようにsyslogでローテーション対象のファイルは以下。

  • /var/log/messages
  • /var/log/secure
  • /var/log/maillog
  • /var/log/spooler
  • /var/log/boot.log
  • /var/log/cron

この6個のファイル(デフォルト)が、syslogによってデータが溜められ、
1日1回ローテーションされています。
logrotateの設定項目は以下を参照してください(・∀・)

logrotateの設定項目

非常にたくさんあります!
1個1個説明!!

◆ compress
古いバージョンのログをgzipで圧縮して保存します。

◆compresscmd
ログを圧縮する場合のコマンド。デフォルトはgzip。
あまり触ることはなさそう。

◆uncompresscmd
ログファイルの展開時にしようするコマンド。デフォルトはunzip。

◆compressext
ログファイルに付与される拡張子の設定。
圧縮(compression)が有効な場合、圧縮コマンドに依存します。

◆compressoptions
圧縮コマンドに付与されるオプション。
これが設定されている場合、デフォルトは-9(最大圧縮のマイナス9)

◆copy
ログファイルのコピーを作ります。オリジナルのログファイルに変更はない。
今あるログのスナップショットを取りたい場合に使うとよい。
このオプションが有効だと、createオプションは意味をなさない。

◆copytruncate
ログをローテーションさせて新しいファイルを作るのではなく、
コピーを作ったあとにログを出力し続ける。
注意しないといけないのはログの入れ替え時の一瞬に
ログが書き込まれるとメッセージをロストする可能性がある。

◆create [mode] [owner] [group]
ログをローテーションし終わった後の新しいファイルのモードを設定する。

◆daily
毎日ログローテーションします。

◆dateext
ログの拡張子を調整できる。

◆delaycompress
前回のログに引き続き出力させたい場合に設定すると、
ローテーションをしなくなる。

◆extension [ext]
ローテーションした後に、ローテーションの前につけるsuffix。
gzip圧縮した場合などの .gz の前に挿入される。

◆ifempty
ログファイルが空の場合にもローテーションする。
その場合0バイトのファイルでローテーションされる。
デフォルトで有効になっている。

◆include [file_or_directory]
別のlogrotate設定を読み込むために使われる。
大元のlogrotate.confでも使われている。

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

◆mail [address]
ローテーションの終了時にメールする。
何も設定しなければメールをしない(nomail)と同じ。

◆mailfirst
ログをローテーションする前にメールを送る。

◆maillast
ログをローテーションした後にメールを送る。
※こちらがデフォルト

◆maxage [count]
countで示された日数よりも古いものを削除する。
maillastとmailが設定されていたら実効される。

◆minsize [size]
sizeで指定されたサイズよりも大きくなったらローテーションされる。

◆missingok
ログファイルがみつからなかった場合はログメッセージなしで次にいく。

◆monthly
毎月ログローテーションしたファイルに対して設定する。

◆nocompress
古いバージョンのログに対して圧縮コマンドを実行いしない。

◆nocopy
オリジナルログファイルをコピーしない。

◆nocopytruncate
ログのコピーを作成した後にオリジナルログにデータを出力し続けない。

◆nocreate
新しいログファイルが生成されないようにする。

◆nodelaycompress
前のログの圧縮を延期しない。

◆nodateext
日付の拡張子を付けずにローテーションする。

◆nomail
過去のログファイルについてメールしない。

◆nomissingok
ログファイルが存在しなければエラーをはく。
※デフォルト動作

◆noolddir
ログファイルは同一のディレクトリにローテーションされる。

◆nosharedscripts
prerotateとpostrotateがログローテートの度に実行される。

◆notifempty
ログが空だったらローテーションしない。

◆olddir [directory]
directoryで指定されたディレクトリにログがローテーションされる。

◆postrotate/endscript
postrotateとendscriptで囲まれた部分に書かれたスクリプトが
ログローテーションが実施された後で実行される。

◆prerotate/endscript
prerotateとendscriptで囲まれた部分に書かれたスクリプトが
ログローテーションが実施される前に実行される。

◆firstaction/endscript
firstrotateとendscriptで囲まれた部分に書かれたスクリプトが
全てのログローテーション前に実行される。

◆lastaction/endscript
lastrotateとendscriptで囲まれた部分に書かれたスクリプトが
全てのログローテーション後に実行される。

◆rotate [count]
ログがローテーションされる世代数を指定する。
ゼロを指定するとローテーション時に古いファイルは削除される。

◆size [size]
sizeで指定されたファイルサイズになったときにログがローテートされる。
100kや100Mという表記も可能。

◆sharedscripts
prescript や postscript は各ログファイルがローテーションされる
タイミングで実行される。しかし、ワイルドカード指定(*)されたログの
ローテーション毎にスクリプトを実行したい場合に使うのがコレ。

◆start [count]
ここで与えられた数字以降の数を使ってファイルがローテーションされる。
ゼロが指定されれうと、ゼロから順番に使用される。
例えば9が指定されると0~8番が飛ばされて .9 からログが始まる。

◆tabooext [+] list
logrotateするファイル名としてのタブーを指定する。
これは include と併用するのがいいかも。
例えば以下のようなものをタブーとして設定するといい。

  • .rpmorig
  • .rpmsave
  • ,v
  • .swp
  • .rpm-new
  • ~

◆weekly
毎週ログローテーションする。

◆yearly
毎年ログローテーションする。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です