Apache ログローテーション設定でディスク容量を節約!rotatelogs活用術

2025-05-27

「rotatelogs」の主な役割と機能

  • 標準出力への出力
    ローテーションせずに、ログを標準出力へ出力するモードもあります。これは、他のログ管理ツールと連携する場合などに利用されます。
  • 柔軟なローテーション設定
    ローテーションの間隔(時間単位)、ローテーションを行うファイルサイズ、ログファイルの保存期間などを細かく設定できます。
  • ファイル名の制御
    ローテーション後の新しいログファイルの名前には、日付や時刻などの情報を含めることができます。これにより、過去のログファイルを時系列で管理できます。
  • ログファイルのローテーション
    一定の時間間隔やファイルサイズに基づいて、自動的にログファイルを新しいファイルに切り替えます。これにより、単一のログファイルが肥大化しすぎるのを防ぎ、管理や解析を容易にします。

Apacheでの「rotatelogs」の設定方法

Apacheの設定ファイル内で、カスタムログ(CustomLog)やエラーログ(ErrorLog)のディレクティブで使用します。通常、ログファイルのパスの代わりに、パイプ記号 (|) に続けて「rotatelogs」コマンドとそのオプションを指定します。

設定例

CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y%m%d_%H%M.log 86400" combined
ErrorLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/error_%Y%m%d.log 604800"

設定例の説明

  • ErrorLog の例

    • |/usr/local/apache2/bin/rotatelogs /var/log/apache2/error_%Y%m%d.log 604800
    • /var/log/apache2/error_%Y%m%d.log はエラーログのローテーション後のファイル名フォーマットです(例: error_20250525.log)。
    • 604800 はローテーションの間隔を秒単位で指定しています(この例では 7日間 = 604800秒)。つまり、毎週新しいエラーログファイルに切り替わります。
    • |/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y%m%d_%H%M.log 86400 combined
    • パイプ (|) の後に続く /usr/local/apache2/bin/rotatelogs が「rotatelogs」プログラムのパスです。
    • /var/log/apache2/access_%Y%m%d_%H%M.log はローテーション後のログファイルの基本名と、日付・時刻のフォーマット指定子です(例: access_20250525_1738.log)。
    • 86400 はローテーションの間隔を秒単位で指定しています(この例では 24時間 = 86400秒)。つまり、毎日新しいログファイルに切り替わります。
    • combined はログのフォーマットを指定しています。

「rotatelogs」の利点

  • パフォーマンスの維持
    巨大なログファイルへの書き込みは、サーバーのパフォーマンスに影響を与える可能性がありますが、ローテーションによってこれを軽減できます。
  • ログ解析の容易化
    小さく分割されたログファイルは、特定の期間のログを検索・解析する際に便利です。
  • ディスク容量の管理
    ログファイルが際限なく大きくなるのを防ぎ、ディスク容量を効率的に利用できます。


一般的なエラーとトラブルシューティング

    • 原因

      • rotatelogs のパスが間違っている
        Apacheの設定ファイル (httpd.conf や VirtualHost 設定) 内で指定している rotatelogs の実行ファイルのパスが正しくない可能性があります。
      • パーミッションの問題
        Apacheサーバーの実行ユーザー(通常は www-datahttpd など)が、rotatelogs 実行ファイルへの実行権限を持っていないか、ログファイルを保存するディレクトリへの書き込み権限を持っていない可能性があります。
      • 設定ファイルの構文エラー
        Apacheの設定ファイルに構文エラーがあり、設定が正しく読み込まれていない可能性があります。
      • ローテーションの条件が満たされていない
        設定されたローテーションの間隔(時間やサイズ)に達していないため、ローテーションがまだ行われていない可能性があります。
      • パイプ処理の問題
        Apacheが rotatelogs を正しく起動できていない可能性があります。
    • トラブルシューティング

      • パスの確認
        設定ファイル内の rotatelogs のパスが正しいか (which rotatelogs コマンドなどで確認できます) を確認してください。
      • パーミッションの確認
        ls -l コマンドなどで rotatelogs の実行権限とログディレクトリの書き込み権限を確認し、必要であれば chmodchown コマンドで修正してください。
      • 設定ファイルのテスト
        apachectl configtest コマンドなどでApacheの設定ファイルにエラーがないか確認してください。
      • ローテーション設定の確認
        設定したローテーションの間隔やサイズが意図通りであるか確認してください。短い間隔でテストしてみるのも有効です。
      • Apacheのエラーログの確認
        Apacheのエラーログ (ErrorLog で指定されたファイル) に、rotatelogs の実行に関するエラーメッセージが出力されていないか確認してください。
  1. ログファイル名が意図した形式にならない

    • 原因

      • 日付・時刻のフォーマット指定子の誤り
        rotatelogs に指定しているファイル名フォーマットの %Y, %m, %d, %H, %M, %S などの指定子が間違っているか、意図しない形式になっている可能性があります。
      • 設定ファイルの再読み込み忘れ
        設定ファイルを変更した後、Apacheを再起動または再読み込み (apachectl graceful) しないと、変更が反映されないことがあります。
    • トラブルシューティング

      • フォーマット指定子の確認
        rotatelogs のマニュアルやドキュメントで、正しいフォーマット指定子を確認してください。
      • Apacheの再起動/再読み込み
        設定変更後に必ず Apache を再起動または再読み込みしてください。
  2. 古いログファイルが削除されない

    • 原因

      • 保存期間の設定がない
        rotatelogs にログファイルの保存期間を指定するオプション (-a または -l と組み合わせて -n) を使用していないため、古いログファイルがそのまま残り続けている可能性があります。
      • 保存期間の設定が正しくない
        保存期間の設定が意図した日数やファイル数になっていない可能性があります。
    • トラブルシューティング

      • 保存期間オプションの確認
        rotatelogs のマニュアルで、保存期間に関するオプション (-a, -l, -n) の使い方を確認し、適切に設定してください。
      • 設定値の確認
        設定した保存期間の値が意図通りであるか確認してください。
  3. Apacheの起動に失敗する

    • 原因

      • rotatelogs の実行に失敗する設定
        設定ファイル内で rotatelogs の呼び出し方が間違っているか、rotatelogs が何らかの理由で異常終了する場合、Apacheの起動に失敗することがあります。
    • トラブルシューティング

      • 設定ファイルの確認
        CustomLogErrorLog のディレクティブで rotatelogs の記述が正しいか確認してください。
      • rotatelogs の単体実行テスト
        問題のありそうな rotatelogs のコマンドをターミナル上で直接実行してみて、エラーが発生しないか確認してください。
      • Apacheのエラーログの確認
        Apacheの起動時のエラーメッセージを確認してください。
  4. ログが全く記録されない

    • 原因

      • rotatelogs の設定ミス
        rotatelogs の出力先が正しく設定されていない可能性があります。
      • パーミッションの問題
        Apacheサーバーの実行ユーザーが、ログファイルを保存するディレクトリへの書き込み権限を持っていない可能性があります。
    • トラブルシューティング

      • 出力先パスの確認
        rotatelogs に指定しているログファイルのパスが正しいか確認してください。
      • パーミッションの確認
        ログディレクトリの書き込み権限を確認し、必要であれば修正してください。

トラブルシューティングのヒント

  • 簡単な設定でテストする
    まずは短いローテーション間隔でシンプルな設定を試し、正常に動作することを確認してから、より複雑な設定に進むと良いでしょう。
  • rotatelogs のマニュアルやドキュメントを参照する
    man rotatelogs コマンドなどで、rotatelogs のオプションや使い方を詳しく調べることができます。
  • 設定変更後は必ず Apache を再起動または再読み込みする
    これを怠ると、設定が反映されず期待通りの動作になりません。
  • Apacheのエラーログを常に確認する
    rotatelogs だけでなく、Apache全体の動作に関するエラーメッセージは、問題解決の重要な手がかりとなります。


基本的なローテーション設定 (時間ベース)

# 毎日午前0時にローテーションし、ログファイル名に日付を含める
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y-%m-%d.log 86400" combined

# エラーログを毎日ローテーションし、古いログを7日分保持する
ErrorLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/error_%Y-%m-%d.log 86400 -l -n 7"
  • 解説
    • CustomLogErrorLog ディレクティブ内で、ログファイルのパスの代わりにパイプ (|) で始まり、rotatelogs コマンドが記述されています。
    • /usr/local/apache2/bin/rotatelogsrotatelogs の実行ファイルのパスです。環境によって異なる場合があります。
    • /var/log/apache2/access_%Y-%m-%d.log/var/log/apache2/error_%Y-%m-%d.log はローテーション後のログファイルの基本名と、日付のフォーマット指定子です (%Y: 年 (4桁), %m: 月 (2桁), %d: 日 (2桁))。
    • 86400 はローテーションの間隔を秒単位で指定しています (24時間 = 86400秒)。
    • -l オプションは、ローテーション時にシンボリックリンクを作成し、常に最新のログファイルを指すようにします。
    • -n 7 オプションは、最新の7世代のログファイルを保持し、それより古いものは削除します。

時間と分単位でのローテーション

# 1時間ごとにローテーションし、ログファイル名に時間と分を含める
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y%m%d_%H%M.log 3600" combined
  • 解説
    • ローテーション間隔が 3600 秒 (1時間) に設定されています。
    • ログファイル名には %H (時間 (24時間形式)) と %M (分) が含まれます。

ファイルサイズに基づいたローテーション

# ログファイルサイズが 10MB を超えたらローテーションする
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access.log 10M" combined
  • 解説
    • ローテーション間隔の代わりに、ファイルサイズ 10M (10メガバイト) が指定されています。ログファイルのサイズがこの値を超えるとローテーションが行われます。

ローテーションとファイル世代管理の組み合わせ

# 毎日ローテーションし、最新の5世代のログファイルを保持する (シンボリックリンクなし)
CustomLog "|/usr/local/apache2/bin/rotatelogs /var/log/apache2/access_%Y-%m-%d.log 86400 -n 5" combined
  • 解説
    • -l オプションがないため、最新のログファイルへのシンボリックリンクは作成されません。

標準出力への出力 (ローテーションしない場合)

# ログをローテーションせずに標準出力へ出力 (通常は他のログ管理ツールと連携する場合に使用)
CustomLog "|/usr/local/apache2/bin/rotatelogs - -" combined
ErrorLog "|/usr/local/apache2/bin/rotatelogs - -"
  • 解説
    • 出力ファイル名の代わりにハイフン2つ (- -) を指定すると、rotatelogs はログをローテーションせずに標準出力へ出力します。
  • Apache の設定ファイルを変更した後は、必ず Apache を再起動または再読み込み (apachectl graceful) して変更を適用してください。
  • rotatelogs のオプションは、Apache のバージョンや rotatelogs 自体のバージョンによって利用できるものが異なる場合があります。詳細は man rotatelogs コマンドで確認してください。
  • 上記のパス (/usr/local/apache2/bin/rotatelogs, /var/log/apache2/) はあくまで例であり、実際の環境に合わせて変更する必要があります。


「rotatelogs」はApacheの設定内で直接利用できる便利な外部プログラムですが、より柔軟なログ処理や特定の要件に合わせてログローテーションをカスタマイズしたい場合には、他の方法を検討することができます。

  1. Apacheの組み込みログローテーション機能 (mod_log_rotate)

    • Apache 2.4.51 以降では、mod_log_rotate というモジュールが導入され、設定ファイル内で直接ログローテーションの制御が可能になりました。
    • 利点
      外部プログラムに依存せず、Apacheの設定だけで完結します。より統合された動作が期待できます。
    • 設定例
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
      RotateLogs "/var/log/apache2/access_%Y-%m-%d_%H_%M_%S.log" 86400
      
      • RotateLogs ディレクティブで、ローテーション後のファイル名とローテーション間隔(秒単位)を指定します。
      • サイズベースのローテーションや、ログファイルの世代管理などのオプションも利用可能です。
    • 注意点
      Apacheのバージョンが比較的新しい必要があります。
  2. ログローテーションツールとの連携

    • logrotate のような、システムレベルで動作するログローテーションツールと連携する方法です。
    • 利点
      Apacheだけでなく、他のアプリケーションのログも一元的に管理できます。より高度なローテーション設定(サイズ、時間、圧縮、スクリプト実行など)が可能です。
    • 設定方法
      • Apacheの設定では、ログファイルをローテーションせずに、通常通りファイルに出力するように設定します。
      • logrotate の設定ファイル (/etc/logrotate.conf/etc/logrotate.d/apache2 など) で、Apacheのログファイルのローテーションルールを定義します。
      • logrotate の設定例
        /var/log/apache2/*.log {
            daily
            rotate 7
            compress
            delaycompress
            missingok
            notifempty
            create 640 www-data adm
            sharedscripts
            postrotate
                apachectl graceful
            endscript
        }
        
      • 解説
        • /var/log/apache2/*.log: ローテーション対象のログファイル。
        • daily: 毎日ローテーション。
        • rotate 7: 7世代のログファイルを保持。
        • compress: ローテーションしたログファイルをgzip圧縮。
        • delaycompress: 最新のログファイルは圧縮せず、次のローテーション時に圧縮。
        • missingok: ログファイルが存在しなくてもエラーを出さない。
        • notifempty: ログファイルが空でなければローテーションを実行。
        • create 640 www-data adm: ローテーション後に新しいログファイルを作成し、所有者とグループ、パーミッションを設定。
        • sharedscriptspostrotate ... endscript: ローテーション後に実行するスクリプト。ここでは Apache を graceful restart しています。
    • 注意点
      logrotate がシステムにインストールされている必要があります。
  3. カスタムスクリプトによるログ処理

    • より高度なカスタマイズが必要な場合は、Perl、Python、Shellスクリプトなどのプログラミング言語で独自のログローテーション処理を実装する方法があります。
    • 利点
      完全に独自のロジックでログ処理を制御できます。例えば、ログの内容に基づいて特別な処理を行ったり、特定の条件でのみローテーションを実行したりできます。
    • 実装例 (Shell スクリプトの簡単な例)
      #!/bin/bash
      LOG_DIR="/var/log/apache2"
      LOG_FILE="access.log"
      DATE=$(date +%Y%m%d-%H%M%S)
      MAX_SIZE="10M"
      
      LOG_PATH="$LOG_DIR/$LOG_FILE"
      ARCHIVE_PATH="$LOG_DIR/${LOG_FILE}.${DATE}.gz"
      
      if [ -f "$LOG_PATH" ] && [ $(du -b "$LOG_PATH" | awk '{print $1}') -gt $((MAX_SIZE * 1024 * 1024)) ]; then
          mv "$LOG_PATH" "$LOG_DIR/${LOG_FILE}.${DATE}"
          gzip "$LOG_DIR/${LOG_FILE}.${DATE}" &
          touch "$LOG_PATH"
          chown apache:apache "$LOG_PATH" # Apacheの実行ユーザーとグループに設定
          echo "Log rotated: $ARCHIVE_PATH" >> "$LOG_DIR/logrotate.log"
      fi
      
      • このスクリプトを cron などで定期的に実行することで、access.log が一定サイズを超えた場合にローテーションと圧縮を行います。
    • 注意点
      スクリプトの作成、テスト、保守が必要になります。Apacheの実行ユーザーの権限にも注意が必要です。
  4. ログ収集・管理ツールとの連携

    • ELK Stack (Elasticsearch, Logstash, Kibana) や Splunk などのログ収集・管理ツールと連携し、Apacheのログをこれらのツールに集約して管理・分析する方法です。
    • 利点
      大規模なログデータの集中管理、リアルタイム分析、可視化などが可能になります。ローテーションはこれらのツール側で管理することもできます。
    • 設定方法
      Apacheのログをファイルに出力する設定はそのままに、これらのツールがログファイルを監視・収集するように設定します。Logstash のようなツールは、ログのローテーション機能も持っている場合があります。
    • 注意点
      これらのツールの導入と設定には一定の知識が必要です。