Ubuntu 16.04 サーバー:logrotate のインストールと設定

logrotate は、頻度やサイズの条件に基づいてログファイルを置き換え、以前のファイルを保存、圧縮、または削除するツールです。Ubuntu では、継続的に増加するログを管理できますが、実際の置き換えのタイミングは、logrotate の実行スケジュールと設定条件によります。

Ubuntu 16.04 のサポートと準備

Ubuntu 16.04 LTS の一般的なセキュリティ保守および Ubuntu Pro の一般的な拡張セキュリティ保守 (ESM) は終了しました。Canonical は別途レガシー追加サービスを提供しているため、Ubuntu 16.04 サポートガイド で適用範囲とコストを確認し、可能であればサポートされている Ubuntu バージョンへのアップグレードを計画してください。以下の基本原則は他のバージョンにも適用されますが、logrotate のインストールバージョンや実行スケジュールによって詳細な動作は異なる場合があります。

まず、インストールされているか確認し、Ubuntu にパッケージが存在しない場合はインストールしてください。本番サーバーの設定を変更する前に、既存の設定および必要なログのバックアップとリカバリ方法を確認してください。

logrotate --version
sudo apt update
sudo apt install logrotate

デフォルト設定と実行スケジュールを確認してください

グローバル設定は一般的に/etc/logrotate.confにあり、個別の設定はファイルが/etc/logrotate.d/を含むように設定されていれば読み込まれます。サーバー上の実際のファイルを確認してください。Apacheパッケージがインストールされている環境では/etc/logrotate.d/apache2が存在する場合がありますが、ログパスや設定はインストール環境によって異なります。

cat /etc/logrotate.conf
ls -l /etc/logrotate.d/
cat /etc/logrotate.d/apache2

Apacheの設定ファイルがないシステムでは、最後のコマンドが失敗する場合があります。2つの設定で同じログパスを重複して管理しないでください。logrotateは自動的に連続実行されることも、独自に実行をスケジュールすることもありません。Ubuntu 16.04では通常/etc/cron.daily/logrotateを通じて定期的に実行されるため、そのファイルとcron経由で実行されているかを確認してください。他のバージョンでは、systemdタイマーなどで実際の実行スケジュールが異なる場合があります。

独立したテストログと設定を作成する

次の演習では、既存の本番ログではなく、新しい一時ディレクトリを使用します。同じシェルで順番に実行し、出力パスを確認してください。一時ディレクトリと個別の状態ファイルを使用するため、システムの既存の logrotate 設定や状態は変更されません。

demo_dir=$(mktemp -d)
printf 'first log line\n' > "$demo_dir/app.log"
cat > "$demo_dir/logrotate.conf" <<EOF
$demo_dir/app.log {
    daily
    rotate 3
    missingok
    notifempty
    compress
    delaycompress
    create 0600
}
EOF
printf 'Test directory: %s\n' "$demo_dir"
cat "$demo_dir/logrotate.conf"

daily は日次ローテーション条件で、rotate 3 は以前のログを最大3回分保持する設定です。missingok はファイルが存在しない場合のエラーを避け、notifempty は空のログをローテーションしません。compress は以前のログを圧縮し、delaycompress は最後にローテーションされたログの圧縮を次のローテーションまで遅延させます。create 0600 はローテーション後に新しいログファイルを作成する際の権限を設定します。

この例の設定ファイルはシステムスケジュールに登録されておらず、実際のアプリケーションもテストログに書き込みません。dailyを設定しても、実行のスケジュールは自動で作成されません。インストールされているバージョンに適したオプションや条件を確認するには、公式の logrotateマニュアルを参照してください。

試運転と実際のローテーションの確認

まず、デバッグモードで設定と期待される動作を確認します。-dはログを変更したり、ステートファイルを更新したりしません。新しいステートファイルの場合、出力はまだローテーションのタイミングではないことを示す場合があります。

logrotate -d -s "$demo_dir/state" "$demo_dir/logrotate.conf"

練習ファイルでのみ回転を強制し、結果を確認してください。-fは条件が満たされていなくても回転を強制するため、実際の運用ログでは軽率に使用してはいけません。

logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
cat "$demo_dir/app.log.1"

成功すると、元の内容はapp.log.1にあり、新しいapp.logが作成されます。最新の回転部分はdelaycompressのため、まだ圧縮されていません。新しいログにコンテンツを追加し、もう一度回転を強制すると、以前の回転部分は通常app.log.2.gzとして圧縮されます。

printf 'second log line\n' >> "$demo_dir/app.log"
logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
gzip -cd "$demo_dir/app.log.2.gz"

最後のコマンドで最初のログ行を確認できます。この演習ではログを記録する実行中のサービスは再現されません。演習が終了したら、出力が保存された一時パスを確認し、不要なファイルを片付けてください。

本番サービスに適用する際に

実行中のプログラムは、ファイル名が変更された後でも以前のログファイルへの書き込みを続けることがあります。サービスにログファイルを再度開かせる手順を確認し、既存のパッケージからpostrotateスクリプトを確認して、新しいファイルの所有者、グループ、およびアクセス権限がサービスに適しているかを検証してください。既存のApacheルールを変更する前に、配布およびサービスのドキュメントを確認し、設定のバックアップを取ってください。

copytruncate はログをコピーしてから元のログをその場で切り詰めます。これはログファイルを再オープンできないプログラムに使用できますが、コピーと切り詰めの間にログが失われる可能性があります。可能であれば、まずサービスがログを再オープンする方法を持っているか確認してください。rotate 3 は保持するローテーション回数を指しており、日数やサイズの制限ではないため、保存ポリシーとディスク使用量は別途確認する必要があります。

ローテーションされていない場合を確認する

  • 設定ファイルがグローバル設定に含まれていること、また対象のパスが実際のログと一致していることを確認してください。空のファイルは notifempty ではローテーションされません。
  • cronまたはタイマーが実際に稼働しているか、状態ファイルおよび定期条件に基づいてローテーションが必要かどうかを確認します。dailyは、1日1回チェックされる環境で毎日正確な時刻にローテーションを保証するものではありません。
  • デバッグ出力およびスケジューラのエラーログで、権限、所有権、構文、および重複パスの問題を確認します。-fを運用ログに適用する前に、結果と復旧計画を確認してください。