logrotate – ログファイルを自動でローテート・圧縮・削除する

ログ取得
スポンサーリンク

logrotate は、ログファイルを一定の条件(サイズ・日付・世代数など)で分割(ローテート)・圧縮・削除し、必要に応じてサービスにログ再オープンを通知するユーティリティです。
実務では /etc/logrotate.d/ で各サービスのルールを管理し、日次のバッチ(systemd timer や cron)で定期実行します。

構文(Syntax)

logrotate [OPTION...] [CONFIG]

# 代表例
logrotate /etc/logrotate.conf
logrotate -d /etc/logrotate.conf       # ドライラン(動作確認)
logrotate -f /etc/logrotate.d/APP.conf # 強制ローテート
  • CONFIG を省略すると通常は /etc/logrotate.conf が使われます。
  • 挙動の多くは設定ファイルのディレクティブで制御します(例: weekly, rotate 4, compress, create, postrotate ... endscript など)。

主なオプション一覧

オプション説明使用例
-d, --debugドライラン。実際には変更せず処理内容を表示logrotate -d /etc/logrotate.conf
-f, --force条件を満たさなくても強制ローテートlogrotate -f /etc/logrotate.d/nginx
-v, --verbose詳細ログを表示logrotate -v /etc/logrotate.conf
-s FILE, --state FILEステートファイル(最後に回した時刻等)を指定logrotate -s ./logrotate.state my.conf
-l FILE, --log FILElogrotate 自体の実行ログを書き出しlogrotate -l /var/log/logrotate-run.log /etc/logrotate.conf
--version / --help版本/ヘルプを表示logrotate --version

参考: ディレクティブ(weekly, size, rotate, compress, delaycompress, copytruncate, create, olddir, dateext, missingok, notifempty, su USER GROUP, postrotate など)は設定ファイル側で指定します。

実行例

1) まずは安全にドライランで確認

説明: 何が行われるかをシミュレーションして確認します。
コマンド:

sudo logrotate -d /etc/logrotate.conf

出力例(例):

reading config file /etc/logrotate.conf
including /etc/logrotate.d
...
considering log /var/log/nginx/access.log
  rotating pattern: weekly (4 rotations)
  compress enabled, delaycompress enabled
  ...

2) 個別ルールを強制ローテート(テストや緊急時)

説明: 条件未達でも今すぐローテートしたい時に使います。
コマンド:

sudo logrotate -v -f /etc/logrotate.d/nginx

出力例(例):

rotating log /var/log/nginx/access.log, log->rotateCount is 4
renaming /var/log/nginx/access.log to /var/log/nginx/access.log.1
creating new /var/log/nginx/access.log mode = 0640 uid = 0 gid = 0
compressing log with: /bin/gzip

3) 独自ステート/ログを使って手元で検証

説明: 本番のステートを汚さず、ローカルの状態ファイルで挙動確認。
コマンド:

sudo logrotate -s ./logrotate.state -l ./logrotate-run.log -v /etc/logrotate.conf

4) 典型的な設定ファイル例(アプリ専用)

説明: アプリのログを週次・4世代保持・gzip圧縮し、ローテート後にプロセスへ HUP を送って再オープンさせます。
/etc/logrotate.d/myapp の内容:

/var/log/myapp/*.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp myapp
    dateext
    sharedscripts
    postrotate
        # アプリが対応していれば、ログ再オープンを通知
        # 例: systemd 管理なら reload、または HUP シグナル
        systemctl reload myapp.service >/dev/null 2>&1 || true
        # 代替例: kill -HUP $(pidof myapp) || true
    endscript
}

5) エラー例:非特権ユーザーで実行し書き込みに失敗

説明: 権限がないとステートファイルへの書き込みや log の create が失敗します。
コマンド:

logrotate -f /etc/logrotate.d/rsyslog

出力例(例):

error: error creating output file /var/log/syslog: Permission denied
error: could not write state file /var/lib/logrotate/status: Permission denied

対処: sudo で実行、または su USER GROUP ディレクティブで適切な権限に切替。

関連コマンド

  • gzip / xz : compress ディレクティブで使われる圧縮コマンド。
  • systemctl : ローテート後にサービスへ reload/HUP を通知。
  • journalctl : systemd-journald のバイナリログを管理(--vacuum-size 等で独自にローテート)。
  • newsyslog : BSD 系のローテーションツール(類似機能)。
  • cat / zcat : ローテート後のログ確認や圧縮ログの閲覧に利用。

備考

  • 実行トリガー: 近年の多くのディストリでは systemdlogrotate.timer により日次で起動します。古い/最小構成では /etc/cron.daily/logrotate が使われることもあります。
  • 設定ファイルの構成:
    • ルート: /etc/logrotate.conf(ここで include /etc/logrotate.d が一般的)
    • 個別: /etc/logrotate.d/*(各サービスのルール)
  • ステートファイル: ローテート実行履歴を保持します(例: Debian系 /var/lib/logrotate/status、RHEL系 /var/lib/logrotate/logrotate.status)。-s で変更可。
  • copytruncate の注意: 稼働中のプロセスを止めずにファイルをコピーしてから空にしますが、短時間のログ欠落が起こり得ます。可能なら postrotate再オープン(HUP/Reload)させるのが安全です。
  • 権限・所有者: 新規ログの作成は create MODE USER GROUP で制御。root 以外が書く場合は su USER GROUP を使います。
  • サイズ/日付条件: size 100Mdaily/weekly/monthly などは併用可。両方満たした時に回すか、どちらかで回すかは実装仕様に依存する部分があるため、要件に合わせてテストしてください。
  • 多量のログ: olddir DIR でローテート先を分離し、dateext/dateformat で命名を安定化すると運用しやすくなります。

参考

  • manページ(コマンド): man 8 logrotate
  • manページ(設定ファイル書式): man 5 logrotate.conf
  • プロジェクト(ソース・Issue・README): https://github.com/logrotate/logrotate
  • systemd timer/サービスの確認: systemctl status logrotate.timer / systemctl status logrotate.service
スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント