Linux システムで最も興味深い (そしておそらく最も重要な) ディレクトリの 1 つが /var/log
です。
このようなファイルはログとして知られており、システムがどのように動作しているか (そして過去にどのような動作をしていたか) を調べるための鍵となります。
CentOS/RHEL/FedoraやDebian/Ubuntu(種類は様々)で/var/log
の中身を見てみると、以下のようなログファイルとサブディレクトリがあります。
なお、システム上で実行されているサービスやその実行時間によっては、結果が多少異なる場合がありますのでご了承ください。
RHEL/CentOSおよびFedoraの場合
# ls /var/log
での DebianとUbuntuの場合
# ls /var/log
いずれの場合も、いくつかのログファイルとディレクトリが見られます。 ログの名前が期待通りに「log」で終わっているものもあれば、日付を使って名前を変えているもの(例えば、CentOSではmaillog-20160822)や、圧縮されているもの(auth.log.2を考えてみましょう)もあることが観察できます。log.2.gz や mysql.log.1.gz など)。
これは、選択されたディストリビューションに基づくデフォルトの動作ではなく、この記事で説明するように、設定ファイルのディレクティブを使用して自由に変更することができます。
ログが永遠に保存されると、最終的に /var/log が存在するファイルシステムを埋め尽くしてしまいます。
簡単に言うと、logrotate は、ある条件 (詳細は後述) を満たすとメイン ログの名前を変更または圧縮し、次のイベントが空のファイルに記録されるようにします。
さらに、「古い」ログ ファイルを削除し、最新のログ ファイルを維持します。
LinuxでのLogrotateのインストール
logrotateをインストールするには、パッケージマネージャーを使用するだけです。
---------- On Debian and Ubuntu ---------- # aptitude update && aptitude install logrotate ---------- On CentOS, RHEL and Fedora ---------- # yum update && yum install logrotate
設定ファイル (/etc/logrotate.conf
) が、/etc/logrotate 内の個々の .conf
ファイルに他のより具体的な設定を置くことを示しているかもしれないことに注意することは価値があります。d.
これは、次の行が存在し、コメントアウトされていない場合に限ります:
include /etc/logrotate.d
物事を整理するのに役立つため、このアプローチを維持し、以下の例では Debian ボックスを使用します。
Linux で Logrotate を設定する
logrotateは非常に多機能なツールであり、いつ、どのようにログをローテーションするか、また、ローテーション後に何をすべきかを設定するのに役立つ多くのディレクティブを提供しています。
次の内容を /etc/logrotate.d/apache2.conf (ほとんどの場合、このファイルを作成する必要があることに注意してください) に挿入し、各行の目的を確認してみましょう:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress}
最初の行は、ブロック内のディレクティブが /var/log/apache2 内のすべてのログに適用されることを示しています:
- weekly は、ツールが週単位でログのローテーションを試みることを意味しています。
- rotate 3 は、ローテーションされたログを3つだけ保持することを意味します。
- size=10M は、ローテーションを行うための最小サイズを 10M に設定します。
- compress および delaycompress は、最新のものを除いて、ローテーションされたすべてのログが圧縮されるべきであることを伝えるために使用されます。
ドライランを実行して、logrotate が今実際に実行されたらどうなるかを見てみましょう。
-d
オプションの後に設定ファイルを使用します (このオプションを省略しても実際に logrotate を実行することができます):
# logrotate -d /etc/logrotate.d/apache2.conf
結果を以下に示します。
ログを圧縮する代わりに、ログがローテーションされた日付の後に名前を変更することができます。 そのためには、dateext
ディレクティブを使用します。
なお、notifemptyを使用すれば、ログが空の場合にはローテーションを行わないようにすることもできます。
また、logrotateに、ローテーションされたログをシステム管理者(ここでは[email protected])にメールで送るように指示してみましょう(これにはメールサーバーの設定が必要ですが、この記事の範囲外です)。 Install Postfix Mail Server
今回は、/etc/logrotate.d/squid.confを使って、/var/log/squid/access.logのみをローテートすることにします:
/var/log/squid/access.log { monthly create 0644 root root rotate 5 size=1M dateext dateformat -%d%m%Y notifempty mail [email protected]}
下の画像を見るとわかるように、このログはローテートする必要がありませんでした。 しかし、サイズの条件が満たされると(size=1M)、ローテートされたログはaccess.log-25082020(2020年8月25日にローテートされた場合)という名前に変更され、メインのログ(access.log)はアクセス権が0644に設定され、rootがオーナー、グループオーナーになった状態で再作成されます。
最後に、最終的にログの数が6個になると、最も古いログが [email protected] に郵送されます。
さて、ローテーションが行われたときにカスタムコマンドを実行したいとしましょう。
例えば、/var/log/myservice内のログのどれかがローテーションされたら、rootにメールを送りたいとします。
/var/log/myservice/* {monthlycreate 0644 root rootrotate 5size=1M postrotate echo "A rotation just took place." | mail root endscript}
最後になりましたが、/etc/logrotate.d/*.conf
にあるオプションは、矛盾が生じた場合にメインの設定ファイルのオプションを上書きすることに注意してください。
Logrotate と Cron
デフォルトでは、logrotate のインストールにより、/etc/cron.daily 内に logrotate という名前の crontab ファイルが作成されます。
そうでなければ、午前7時35分頃に実行されます。 確認するには、/etc/crontab または /etc/anacrontab のいずれかで cron.daily を含む行を監視します。
まとめ
複数のログを生成するシステムでは、logrotate を使用することで、そのようなファイルの管理を大幅に簡素化できます。
この記事で説明したように、定期的に、またはファイルが所定のサイズに達したときに、自動的にログの回転、圧縮、削除、およびメール送信を行います。 詳しくはmanページを参照してください
。