こんにちは、皆さん。今日はLinuxでログファイルなどのファイルの肥大化を防止するためのログローテーションの機能について学習していきます。AWSのEC2インスタンスにSSH接続できている状態を前提として解説していきます。また、前提知識として定期処理実行のクロンジョブの設定ができることが必要となります。学習がまだの方は先に「Linux|定期処理(Cronジョブ)実行の設定方法」を学習してからこちらの記事に戻ってきてください。

Amazon Linux 2023のEC2インスタンスにはデフォルトで logrotate はインストール済みです。
ログローテーションの設定方法
設定ファイルの場所
ログローテーションのデフォルトの設定ファイルは以下の場所にあります。
/etc/logrotate.conf
これはデフォルト設定ファイルで、個別の、各ログローテーション対象ファイル用の設定フィルの中でこのデフォルト設定ファイルに定義されている項目を上書き定義しない場合は、デフォルト設定の内容が適用されます。
設定項目
以下に代表的な設定項目を列挙します。
- hourly|daily|weekly|monthly|yearly
-
ローテーションの時間のインターバルを指定する場合にはこれらを指定します。
- size {file size}
-
ローテーションを時間のインターバルではなく、ファイルサイズで指定する場合にsizeを指定します。
ファイルサイズには、10、10k、10M、10Gなどの指定もできます。 - missingok
-
ローテートしたいファイルが存在しなくてもエラーにはしない。
- rotate {数値}
-
何ファイル文バックアップとして保持しておくかを指定。
- notifempty
-
ローテートしたいファイルが空の場合はローテートしない。
- create
-
ローテート後のファイルのパーミッションを設定する。
- dateext
-
ローテート後のファイル名の末尾に数値ではなく日時をつける
- dateformat
-
dateext に使用する日時のフォーマットを指定する。
- postrotate
-
ログローテーション処理後にpostrotateからendscriptの間のスクリプトを実行できる。
以下の様に man コマンドで logrotate コマンドの詳細オプションを確認できます。
man logrotate
設定ファイルの例
viコマンドで以下の場所に mylog というログローテーション用の設定ファイルを作成してください。
vi /etc/logrotate.d/mylog
設定内容は以下になります。
/home/ec2-user/logfile.log {
daily
missingok
rotate 7
create 0640 root root
dateext
dateformat -%Y%m%d%H%M%S
postrotate
systemctl reload mylog.service > /dev/null 2>&1 || true
endscript
}
1行目にログローテーションさせたいファイル名パスを指定しています。そして、ここでは最後にログローテーション後に毎回ログローテーションサービスの再起動を行っています。これは、他のログラムがログローテーション後に新しいログファイルに書き込みをしない可能性があるため、ログローテーションのサービスの再起動をしています。
ログローテーションの実行
ログローテーションコマンドを実行する際、2つの方法があります。デバッグ用に実際にはログローテーションをしないドライラン実行とコマンド実行時に実際にログローテーションをする強制実行です。
【ドライラン(dry-run)】
logrotate -d /etc/logrotate.d/mylog
【強制実行(force)】
logrotate -f /etc/logrotate.d/mylog
ログローテーション後のファイル
前述の設定ファイルの例では以下のようなログローテーションが行われます。
logfile.log
logfile.log-20250225050002
logfile.log-20250226050001
logfile.log-20250227050002
logfile.log-20250228050003
logfile.log-20250301050002
logfile.log-20250302050002
logfile.log-20250303050003
ログローテーションの自動化
以下のディレクトリにログローテーションの設定ファイルが作成された場合は、設定ファイルに基づいて自動的にログローテーションが実行されます。
/etc/logrotate.d/
それ以外の任意の場所にログローテーションの設定ファイルを作成した場合は、定期実行処理のクロンジョブの設定からログローテーションのコマンドを定期的に実行する必要があります。
0 5 * * * /usr/sbin/logrotate -f /root/mylog >> /home/ec2-user/logfile.log 2>&1
まとめ
今回の記事ではLinuxのログローテーションについて解説しました。ログファイルにログローテーションを設定し忘れてしまうと、フィアルが肥大化してハードディスクが一杯になってしまい書き込みができずサーバが停止してしまうリスクがあります。Webのシステム開発においても、ログローテーションはこういったリスクを回避するために必要なスキルとなってきます。
コメント