ログローテーションとは

【連載コラム:Linuxでサーバーを構築してみよう(9)」
前回に引き続きログについてですが、ログを取得し続けてログファイルが大きくなることに対応する方法を紹介します。

最終更新日:2022年09月16日

サーバー構築の連載コラムの9回目は、ログのローテーションについてです。前回のコラムではログの取得と管理について解説しましたが、ログ取得を継続していく上で大切となるログローテーションを解説します。


ログをローテーションする

前回、rsyslogの設定方法について取り扱いましたが、それだけではログファイルが非常に大きなサイズのファイルになりやすく、扱いづらいものになってしまいます。これに対応するための技術に「ログローテーション」というものがあり、それを実現するツールが「logrotate」です。

ログローテーションとは、ログファイルが一定のファイルサイズに達したり、一定の期間が経過したらファイル名を変更しログファイルを切り分け、古くなったログファイルは消去する作業を言います。これによって、ログファイルの肥大化を防ぎます。

logrotateとは

「logrotate」は、ログファイルをローテーションし、必要に応じて圧縮などを行うツールです。「logrotate」を使うことによって、「週次や月次でローテーションする」「ファイルサイズがある値を超えたらローテーションする」といったことができます。

「logrotate」は、デーモンではなく「cron」によって実行されます。このため、logrotateの利用にはcronが動作していることが必須となります。もっとも、たいていの場合cronはデフォルトで動作しているはずです。また、logrotateの設定ファイルを変更したとしても、サービスの再起動は必要ありません。

「logrotate」は、多くのLinuxディストリビューションで採用されています。試しに、ある程度の期間稼働しているLinuxマシンで次のコマンドを実行してみます。

$ ls /var/log/ |grep messages
messages
messages-20220626.gz
messages-20220703.gz
messages-20220710.gz
messages-20220717

/var/log/messagesが分割されていることがわかります。後ろの「20220626」がlogrotateによって分割された日付です。「.gz」がついているファイルはgzipによって圧縮されています。このように、ログファイルを分割して圧縮する仕組みを提供するのが「logrotate」です。

logrotateの設定ファイル

logrotateの設定ファイルは/etc/logrotate.confですが、rsyslogと同様「/etc/logrotate.d/」配下の、ファイル名が.confで終わるファイルもインポートされます。

設定ファイルで利用できるオプション

設定ファイルで利用できる主なオプションと、その意味を示します。

rotate [N]
[N]世代数のログファイルを保存し、これより古いログファイルは削除する。この記述がない場合、古いログはすべて削除されてしまうため注意。

compress/nocompress
compressを指定すると古いログファイルをgzipで圧縮する。nocompressを指定すると圧縮されない。

copytruncate
更新中のログファイルを別名にmvせず、cpした後に更新中のログファイルを空にする。

create
ローテーションで更新中のログファイルを古いログファイルにリネーム (mv) した後に、すぐに同じ名前のファイルを作る。

daily/weekly/monthly/yearly
日次、週次、月次、年次でローテーションする。

dateext
古いログファイルをリネームするとき、ファイル名の語尾に日付8桁 (-YYYYMMDD)を付加する。

ifempty/notifempty
ifemptyを指定すると空ファイルの場合でもローテートする。notifemptyを指定すると空ファイルをローテートさせない。

maxage [N]
[N] 日ぶんのログを確保し、それより古いログファイルを削除する。

size [N]
ログファイルのサイズが [N]バイトを超えたらローテートする。なお、この指定がある場合、daily、weeklyなどは無効となる。

maxsize [N]
ログファイルのサイズが [N]バイトを超えたらローテートする。daily、weelkyなどのインターバル内であってもローテートする。

minsize [N]
ログファイルのサイズが [N]バイトを超えたらローテートする。daily、weelkyなどのインターバル内である場合はローテートしない。

missingok
ログファイルが無くてもエラー扱いしない。

olddir [directory]
古いログファイルを [directory] に移動する。

mail [メールアドレス]
ログがローテーション期間を超えたときに、ログを指定したメールアドレスに送信する。(メールアドレスは基本的にローカルのものを利用することが望ましい)

postrotate ~ endscript
ローテートした後にスクリプトを実行する。postrotateとendscriptのあいだに指定されたスクリプトが実行される。

設定ファイルの記述

設定ファイルの記述方法と、その意味を解説します。非常に簡単な設定例ですが、たとえば次のように設定したとします。

compress
rotate 10

 /var/log/messages
 /var/log/mail
 {
     weekly
     missingok
     rotate 5
 } 
(以下略)

まず、冒頭2行に記述された「compres」と「rotate 10」は、グローバルオプションと呼ばれ、ローテーションするすべてのログファイルに対して適用されます。

一方、{}で囲まれたweeklyやmissingokなどは、{の前で指定された /var/log/messagesおよび/var/log/mailに対してのみ有効になります。この{}で囲まれたオプションはローカルオプションと呼ばれます。
グローバルオプションで全ログファイルに対して行いたい動作を指定し、ローカルオプションで各ファイルに対して行うことを指定します。

なお、この例ではグローバルオプションとローカルオプションでrotateが重複しており世代数の指定が異なっていますが、このような記述がある場合はローカルオプションが適用されます。すなわち、グローバルオプションはデフォルト値を指定するものだと考えるとよいでしょう。

まとめ

Linuxディストリビューションをインストールすると、いくつかのログローテーションについての設定ファイルが配置されています。それらを見てどのような設定を行うのか、また世代数を変更するなどして動作を確認してみるところから始めると理解がしやすいでしょう。

筆者紹介
川原 龍人 氏

川原 龍人 氏

1975年生まれ。
著書に「BIND9によるDNSサーバ構築」、「シェルスクリプト ポケットリファレンス Bash編(技術評論社)」など。
予備校講師としても活躍中。Linuxとのつきあいは20年を超える。

バックナンバー

第9回:ログローテーションとは

第8回:ログの取得と管理

第7回:アクセス制限

第6回:OpenSSHの活用

第5回:ユーザーアカウントとアクセス制限

第4回:テスト環境を構築する

第3回:サーバー構築をハードウェアの視点から考えてみる

第2回:CMSを使ったWebサイトを構築するには?

第1回:Linuxでサーバーを構築しよう

ページトップへ