Linuxでログファイルの肥大化を防ぐ方法(logrotate)

Linuxでログファイルの肥大化を防ぐ方法(logrotate)

Linuxでは、さまざまなプログラムが出⼒するログがログファイルに書き込まれていきます。これらのログファイルは、何もしなければファイルサイズが肥⼤化し、ハードディスク容量を圧迫してしまいます。

これを回避するためにLinuxでは、logrotateというツールを使用して定期的にログファイルをローテーションする仕組みが用意されています。

最近では、パッケージをインストールするとログローテーションも自動的に設定してくれるケースもありますが、自分で設定しなければならないこともあります。

そこでここでは、logrotateの概要と基本的な設定方法を、自分への備忘録を含め紹介します。

この記事は、以下の環境での動作結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
CentOS Linux7.4.1708

logrotateとは

logrotateは、定期的に新しいログファイルを作成し、古いログファイルをリネームしローテーションします。また、保存世代を過ぎた古いログファイルはローテーション時に削除します。このようにして、ログを一定期間だけ保存することができるようになっています。

これらの処理は、logrotateとcronが連動することにより実⾏されており、cronの設定ファイル「/etc/cron.daily/logrotate」には、毎⽇logrotateを実⾏するよう記述されています。

logrotateの設定

ログローテーションの設定は、logrotateの全般設定を記述する/etc/logrotate.confファイルと、/etc/logrotate.d/ディレクトリ以下に配置する各ログファイルのローテーション設定ファイルに記述します。

なお、/etc/logrotate.d/ディレクトリ以下に配置する各ログファイルのローテーション設定ファイルには、全般設定と異なる部分のみ記述します。

Memo

全般設定と同じ設定項目に異なる値が設定されている場合は、各ログファイルのローテーション設定ファイルの設定が優先されます。

/etc/logrotate.conf

/etc/logrotate.confの内容は以下の通りです。

# see "man logrotate" for details
# rotate log files weekly
weekly

# 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

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

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}

/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}

記載されているオプションの意味は、以下のとおりです。

設定値意味
weeklyログファイルを週単位でローテーションする指定です。この他に、monthly(毎⽉)や daily(毎⽇)などを指定できます。
rotateログファイルを何世代までバックアップするかを指定します。ここでは「4」が指定されていますので、4 世代分のログファイルを保存します。
createcreate mode owner group, create owner group
ローテーション後すぐに同名の新規ログファイルを作成するための指定です。新規ログファイル作成時に、アクセス権や所有者を指定できます。
compressローテーションしたログファイルをgzipで圧縮するための指定です。
include指定されたファイル、またはディレクトリ以下のファイルを設定ファイルとして読み込みます。ここでは、/etc/logrotate.dが指定されているので、このディレクトリの設定ファイルも読み込まれます。
dateext古いログファイルをアーカイブするときに、YYYYMMDDのような日付の拡張子を付け加えます。 
minsizelogrotateコマンド実行時に、ローテーション周期を経過しており、かつminsizeで指定したサイズを超えていたときにローテーションを実行します。たとえば「weekly」と「minsize 1M」を指定している場合、前回のローテーションから1週間以上経過しており、かつファイルサイズが1MBを超えている場合にのみローテーションが実行されます。

/etc/logrotate.dディレクトリ内の設定ファイル

/etc/logrotate.d ディレクトリ内の設定ファイルは、以下の書式で記述します。「logfile」で指定したログファイルに対して、設定内容に記載した設定でローテーションが行われます。

logfile [logfile ...]{
設定内容
...
}

例として「/etc/logrotate.d/syslog」ファイルの内容を説明します。このファイルは、syslogdが出⼒するログファイルをローテーションするための設定ファイルです。

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

記載されているオプションの意味は、以下のとおりです。

設定値意味
missingokログファイルが存在しなくてもエラーを出⼒しないための指定です。
sharedscripts複数指定したログファイルに対して、postrotateで記述したコマンドを実⾏します。
postrotate - endscriptpostrotateとendscriptの間に記述したコマンドをローテーション後に実⾏します。

あとがき

上で紹介した以外にも、logrotateには多くのオプションがありますので、詳細は「man logrotate」で参照してみてください。