時間が経つにつれ、auth
、kern
、messages
などの/var/log
のログが巨大になることに気付きました。 logrotate
エントリを作成しました:
$ cat /etc/logrotate.d/auth.log
/var/log/kern.log {
rotate 5
daily
}
$ cat /etc/logrotate.d/kern.log
/var/log/kern.log {
rotate 5
daily
}
$ cat /etc/logrotate.d/messages
/var/log/messages {
rotate 5
daily
postrotate
/bin/killall -HUP syslogd
endscript
}
また、compress
オプションを有効にしています。
$ grep compress /etc/logrotate.conf
# uncomment this if you want your log files compressed
compress
これはauth.log
、kern.log
などでうまく機能します。つまり、これらのログのそれぞれがgzipされてローテーションされ、過去5日間のログが保持されます。 /var/log/messages
は圧縮されないため、5日を超えるログが生成されます。
$ ls /var/log/messages*
/var/log/messages /var/log/messages-20100213
/var/log/messages-20100201 /var/log/messages-20100214
/var/log/messages-20100202 /var/log/messages-20100215
/var/log/messages-20100203 /var/log/messages-20100216
/var/log/messages-20100204 /var/log/messages-20100217
/var/log/messages-20100205 /var/log/messages-20100218
/var/log/messages-20100206 /var/log/messages-20100219
/var/log/messages-20100207 /var/log/messages-20100220
/var/log/messages-20100208 /var/log/messages-20100221
/var/log/messages-20100209 /var/log/messages-20100222
/var/log/messages-20100210 /var/log/messages-20100223
/var/log/messages-20100211 /var/log/messages-20100224
/var/log/messages-20100212
ServerFaultの別のlogrotate
質問 で説明されているように、ファイルの末尾がファイルごとに異なるため、古いログは(ほとんどの場合)削除されません。これは、ファイルがgzipされていないためと考えられます。
他のすべてのログファイルと同様に、過去5日間のログを保持して/var/log/messages
を圧縮およびローテーションするにはどうすればよいですか?何が欠けていますか?
EDIT 1:最初のカップルの回答で要求された追加情報。
Gentoo Linuxを実行しています。私の/etc/logrotate.conf
ファイル:
$ cat /etc/logrotate.conf
# $Header: /var/cvsroot/gentoo-x86/app-admin/logrotate/files/logrotate.conf,v 1.3 2008/12/24 20:49:10 dang Exp $
#
# Logrotate default configuration file for Gentoo Linux
#
# See "man logrotate" for details
# rotate log files weekly
weekly
#daily
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
compress
# packages can drop log rotation information into this directory
include /etc/logrotate.d
notifempty
nomail
noolddir
# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
/etc/logrotate.d
には、上記のカスタム構成ファイルと、それらのパッケージによってインストールされたmysql、rsyncなどの構成が含まれています。
ルートcrontab
は空です:
$ Sudo crontab -l
no crontab for root
私はすべての/etc/cron.{daily,hourly,monthly,weekly}
に関連するsyslogがないか確認しました。/var/log/syslog
と/var/log/auth.log
をローテーションさせるスクリプトがあります。
次に、CarpeNoctemの提案に従って/var/log/messages
- only logrotate
構成ファイルを作成しました。
$ cat logrotate-messages
weekly
rotate 4
create
dateext
compress
notifempty
nomail
noolddir
/var/log/messages {
rotate 5
daily
postrotate
/bin/killall -HUP syslogd
endscript
}
次に、logrotate
を手動で実行しました。
$ logrotate -d logrotate-messages -f
reading config file logrotate-messages
reading config info for /var/log/messages
Handling 1 logs
rotating pattern: /var/log/messages forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/messages
log needs rotating
rotating log /var/log/messages, log->rotateCount is 5
dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/log/messages to /var/log/messages-20100224
creating new /var/log/messages mode = 0644 uid = 0 gid = 0
running postrotate script
running script with arg /var/log/messages : "
/bin/killall -HUP syslogd
"
compressing log with: /bin/gzip
$ which gzip
/bin/gzip
$ file /bin/gzip
/bin/gzip: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
上記のログによると、logrotate
は/ bin/gzipでログを圧縮しましたが、/var/log
に圧縮されたメッセージファイルがありません。また、ローテーションされた古いファイルのグロビングが失敗しました。
EDIT 2:古い.gz
ファイルに/var/log/message-*
サフィックスを追加した後、logrotate
runのデバッグ出力を追加します。
まずは次のとおりです。
$ ls /var/log/messages*
/var/log/messages /var/log/messages-20100222.gz
/var/log/messages-20100219.gz /var/log/messages-20100223.gz
/var/log/messages-20100220.gz /var/log/messages-20100224.gz
/var/log/messages-20100221.gz
次に、カスタム構成ファイルを使用してlogrotate
を実行します。
$ logrotate -d logrotate-messages -f
reading config file logrotate-messages
reading config info for /var/log/messages
Handling 1 logs
rotating pattern: /var/log/messages forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/messages
log needs rotating
rotating log /var/log/messages, log->rotateCount is 5
dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
removing /var/log/messages-20100219.gz
removing old log /var/log/messages-20100219.gz
destination /var/log/messages-20100224.gz already exists, skipping rotation
今回は、logrotate
のグロブが成功し、6番目の圧縮ログファイルを見つけて、削除しようとしています。ファイルは実際には削除されません。これは、デバッグモードで実行しているためだと思います。
/var/log/messages
のdelaycompress
オプションを有効にすると効果があるかどうか知りたいです。有効にして、翌朝結果を確認します。
delaycompress
を/var/log/messages
の構成セクションに追加すると、問題が解決しました。
man logrotate
から:
delaycompress
Postpone compression of the previous log file to the next rota‐
tion cycle. This only has effect when used in combination with
compress. It can be used when some program cannot be told to
close its logfile and thus might continue writing to the previ‐
ous log file for some time.
sysklogd
、私のsyslogデーモンは、ログファイルを閉じるように指示できないので、これが必要です。
興味深いことに、私が持っていた元の構成(delaycompress
ディレクティブなし)はman logrotate
から直接取得したものです(weekly
をdaily
に変更した場合を除く)。
# sample logrotate configuration file
compress
/var/log/messages {
rotate 5
weekly
postrotate
/usr/bin/killall -HUP syslogd
endscript
}
この情報だけで言うのは難しいですが、何回私を救ったのかをお話しします。
Logrotateには、stdoutに必要な各ステップのプレイバイプレイを出力するデバッグオプションがあります。したがって、この場合は次のようにすることができます。
logrotate -d /etc/logrotate.conf
出力は正確に何が起こっているかを教えてくれます。また、デバッグ出力を絞り込む場合は、次のようにすることができます
logrotate -d /etc/logrotate.d/messages
メインのlogrotate.confオプションを一時的にそのファイルブロックに配置することもできますが、その場合、ファイルを直接指定すると、メインのconfigsオプションが読み込まれることはありません。個々のファイルを指定すると、-f
(強制)オプションとデバッグオプションを組み合わせて、実行中のメッセージファイルの実際のローテーションを確認できます。
Logrotate.confでこの設定を試すことを検討してください:
dateformat .%Y%m%d
ダッシュの代わりにドットを使用するように既存のメッセージファイルの名前を変更します。その後、再度logrotateを試してください。
以下の手がかりは、どういうわけかオプションとして解釈されている場合、ダッシュがグロブの失敗の原因になっている可能性があることを私に信じさせました(どこで-これを修正します)。それは意味がありませんが、それは可能かもしれません。
dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed