web-dev-qa-db-ja.com

logrotateは/ var / log / messagesを圧縮しません

時間が経つにつれ、authkernmessagesなどの/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.logkern.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/messagesdelaycompressオプションを有効にすると効果があるかどうか知りたいです。有効にして、翌朝結果を確認します。

11
Mike Mazur

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から直接取得したものです(weeklydailyに変更した場合を除く)。

   # sample logrotate configuration file
   compress

   /var/log/messages {
       rotate 5
       weekly
       postrotate
           /usr/bin/killall -HUP syslogd
       endscript
   }
8
Mike Mazur

この情報だけで言うのは難しいですが、何回私を救ったのかをお話しします。

Logrotateには、stdoutに必要な各ステップのプレイバイプレイを出力するデバッグオプションがあります。したがって、この場合は次のようにすることができます。

logrotate -d /etc/logrotate.conf

出力は正確に何が起こっているかを教えてくれます。また、デバッグ出力を絞り込む場合は、次のようにすることができます

logrotate -d /etc/logrotate.d/messages

メインのlogrotate.confオプションを一時的にそのファイルブロックに配置することもできますが、その場合、ファイルを直接指定すると、メインのconfigsオプションが読み込まれることはありません。個々のファイルを指定すると、-f(強制)オプションとデバッグオプションを組み合わせて、実行中のメッセージファイルの実際のローテーションを確認できます。

5
CarpeNoctem

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