【RHEL】ログローテーションの設定方法とlogrotateコマンド解説

RHEL

今回は、RHEL(Red Hat Enterprise Linux)でのログローテーション設定方法とlogrotateコマンドの活用方法について、分かりやすく解説します。

Linuxサーバーを運用していると、日々蓄積されるログファイルの管理は避けて通れない重要な課題です。適切なログローテーションを設定しないと、ディスク容量が枯渇してシステム障害を引き起こす可能性があります。

この記事を読めば、logrotateの基本から実践的な設定方法まで、一通りの知識を身につけることができます。


ログローテーションとは?なぜ必要なのか

ログローテーションとは、ログファイルを定期的に切り替え、古いログを圧縮・削除する仕組みです。Linuxサーバーでは、システムやアプリケーションが常にログを出力し続けています。このログを放置すると、以下のような問題が発生します。

ログローテーションをしないとどうなる?

  • ディスク容量が枯渇し、システムが正常に動作しなくなる
  • ログファイルが巨大化し、障害調査時にファイルを開けない
  • サービスがログを書き込めなくなり、予期しないエラーが発生する

特に本番環境では、ディスク容量の枯渇はサービス停止に直結する重大なインシデントです。logrotateを正しく設定することで、これらのリスクを未然に防ぐことができます。


logrotateの仕組みと設定ファイルの構成

RHELでは、logrotateがデフォルトでインストールされており、cronによって定期的に実行されます。

設定ファイルの場所

ファイル/ディレクトリ 役割
/etc/logrotate.conf メインの設定ファイル(グローバル設定)
/etc/logrotate.d/ 個別アプリケーション用の設定ファイルを格納するディレクトリ
/var/lib/logrotate/logrotate.status ローテーション実行状況を記録するステータスファイル

設定ファイルの優先順位

logrotateは、まず/etc/logrotate.confを読み込み、その中でinclude /etc/logrotate.dの記述があれば、該当ディレクトリ内の設定ファイルも読み込みます。個別の設定ファイルで指定したオプションは、グローバル設定を上書きします。


logrotate.confの基本的な書き方

以下は、/etc/logrotate.confの基本的な構成例です。

# グローバル設定
weekly
rotate 4
create
dateext
compress

# 個別設定の読み込み
include /etc/logrotate.d

個別ログファイルの設定例

特定のログファイルに対して個別の設定を行う場合は、以下のように記述します。

/var/log/messages {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
}

logrotateの主要オプション一覧

初心者の方が押さえておくべき主要なオプションを一覧表にまとめました。

ローテーション頻度のオプション

オプション 説明
daily 毎日ローテーションを実行する
weekly 毎週ローテーションを実行する
monthly 毎月ローテーションを実行する
yearly 毎年ローテーションを実行する

保存世代数・ファイル管理のオプション

オプション 説明
rotate [数値] 保存する世代数を指定(例:rotate 4 で4世代保存)
size [サイズ] 指定サイズを超えたらローテーション(例:size 100M)
maxsize [サイズ] 指定サイズを超えたら頻度に関係なくローテーション
minsize [サイズ] 指定サイズ未満ならローテーションしない
maxage [日数] 指定日数を超えた古いログを削除する

圧縮関連のオプション

オプション 説明
compress ローテーション後のログをgzip圧縮する
nocompress 圧縮しない
delaycompress 1世代前のログから圧縮を開始する(最新のローテーションファイルは圧縮しない)
compresscmd [コマンド] 圧縮に使用するコマンドを指定(デフォルト:gzip)

ファイル作成・権限のオプション

オプション 説明
create [権限] [ユーザー] [グループ] ローテーション後に新しいログファイルを作成
nocreate 新しいログファイルを作成しない
copytruncate ログファイルをコピー後、元ファイルを空にする(サービス再起動不要)

エラーハンドリングのオプション

オプション 説明
missingok ログファイルが存在しなくてもエラーにしない
nomissingok ログファイルが存在しない場合はエラーにする
notifempty ログファイルが空の場合はローテーションしない
ifempty ログファイルが空でもローテーションする

その他の便利なオプション

オプション 説明
dateext ローテーションファイルに日付を付与(例:messages-20240115)
dateformat [書式] 日付の書式を指定(例:dateformat -%Y%m%d)
olddir [ディレクトリ] ローテーション後のファイルを指定ディレクトリに移動
sharedscripts 複数ログをまとめて処理する際、スクリプトを1回だけ実行
postrotate/endscript ローテーション後に実行するコマンドを記述
prerotate/endscript ローテーション前に実行するコマンドを記述

logrotateコマンドの使い方

基本的なコマンド構文

logrotate [オプション] 設定ファイル

よく使うコマンドオプション

オプション 説明
-d, –debug デバッグモード(実際には実行せず、動作を確認)
-f, –force 強制的にローテーションを実行
-v, –verbose 詳細な実行ログを出力
-s, –state [ファイル] ステータスファイルを指定

デバッグモードで設定を確認する

本番環境で設定を変更する前に、必ずデバッグモードで動作確認を行いましょう。

# 設定ファイル全体をデバッグモードで確認
logrotate -dv /etc/logrotate.conf

# 特定の設定ファイルのみ確認
logrotate -dv /etc/logrotate.d/httpd

重要:デバッグモード(-d)では実際のローテーションは実行されません。 設定内容の文法チェックと、どのような動作をするかのシミュレーションが行われます。

手動でローテーションを強制実行する

# 強制実行(verbose付き)
logrotate -fv /etc/logrotate.conf

# 特定のログのみ強制実行
logrotate -fv /etc/logrotate.d/httpd

実践的な設定例

システムログ(/var/log/messages)の設定例

/var/log/messages {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
    dateext
    dateformat -%Y%m%d
}

この設定では、毎日ローテーションを行い、14世代(2週間分)のログを保存します。delaycompressにより、直近のローテーションファイルは圧縮せず、障害発生時の調査をしやすくしています。

Apacheログの設定例

/var/log/httpd/*log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root apache
    dateext
    sharedscripts
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}

Apacheのログはアクセス量によって急速に増大するため、dailyで毎日ローテーションし、30世代保存しています。postrotateでApacheをリロードし、新しいログファイルへの書き込みを開始させます。

Nginxログの設定例

/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx adm
    dateext
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

NginxはUSR1シグナルでログファイルを再オープンするため、postrotateでシグナルを送信しています。


本番環境での設定変更時の注意点

本番環境でlogrotateの設定を変更する際は、以下の点に十分注意してください。

1. 必ずデバッグモードで事前確認する

logrotate -dv /etc/logrotate.d/your-config

設定ファイルの文法エラーや意図しない動作がないか確認してから本番適用しましょう。

2. 設定ファイルのバックアップを取る

cp /etc/logrotate.d/httpd /etc/logrotate.d/httpd.bak.$(date +%Y%m%d)

3. ログの保存期間は慎重に決定する

ログを短期間で削除すると、障害調査時に必要なログが残っていない事態になります。セキュリティ要件や監査要件も考慮して保存期間を決定してください。

4. ディスク容量の監視を併用する

logrotateだけに頼らず、ディスク容量の監視も併せて実施しましょう。

# ディスク使用量の確認
df -h

# ログディレクトリのサイズ確認
du -sh /var/log/*

トラブルシューティング

ローテーションが実行されない場合

  1. ステータスファイルを確認する
cat /var/lib/logrotate/logrotate.status

最終実行日時が記録されています。

  1. cronが正常に動作しているか確認する
systemctl status crond
  1. 設定ファイルの文法エラーを確認する
logrotate -dv /etc/logrotate.conf 2>&1 | grep error

「file has already been rotated」エラー

同じ日に複数回ローテーションを試みると発生します。強制実行する場合は-fオプションを使用してください。

権限エラーが発生する場合

createオプションで指定したユーザー・グループが存在するか、また適切な権限が設定されているか確認してください。


まとめ

この記事では、RHELにおけるlogrotateの基本概念から実践的な設定方法まで解説しました。ログローテーションは地味ですが、サーバー運用において非常に重要な設定です。特にディスク容量の枯渇は、サービス停止につながる重大なインシデントを引き起こす可能性があります。

まずデバッグモードで動作確認する習慣を身につけ、本番環境での設定変更は慎重に行うようにしましょう。この記事が、皆さんのサーバー運用の一助となれば幸いです。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

RHELITナレッジ
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。
得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。
※サーバ運用費がかかっているので、広告を掲載させて頂いてます。

StarTellerをフォローする
シェアする
StarTellerをフォローする

コメント

タイトルとURLをコピーしました