言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. logrotate

logrotate

『logrotate』は Linux のログファイルを自動的にローテーション・圧縮・削除するツールです。『/etc/logrotate.conf』がグローバル設定ファイルで、『/etc/logrotate.d/』ディレクトリ以下にアプリケーションごとの設定ファイルを置きます。『daily』、『weekly』、『size』で回転タイミングを指定し、『compress』で古いログを gzip 圧縮、『postrotate』でローテーション後にデーモンを再起動するといった処理を記述できます。

構文

# -----------------------------------------------
#  /etc/logrotate.d/ 設定ファイルの基本構造
# -----------------------------------------------

# {ログファイルのパス} {
#   ローテーションの頻度
#   保存世代数
#   圧縮オプション
#   エラー処理オプション
#   ローテーション後に実行するスクリプト
# }

/var/log/kyo-app/*.log {

    # -----------------------------------------------
    #  ローテーションの頻度(いずれか1つを指定)
    # -----------------------------------------------

    # daily    → 毎日ローテーションします
    # weekly   → 毎週ローテーションします
    # monthly  → 毎月ローテーションします
    # size {N} → ファイルサイズが N を超えたときにローテーションします
    #             単位: k(キロバイト)/ M(メガバイト)/ G(ギガバイト)
    #   例: size 100M
    daily

    # -----------------------------------------------
    #  保存世代数
    # -----------------------------------------------

    # rotate {N}
    #   → ローテーション済みファイルを N 世代分保持します
    #   → N+1 世代目のファイルは自動的に削除されます
    rotate 7

    # -----------------------------------------------
    #  圧縮設定
    # -----------------------------------------------

    # compress
    #   → ローテーション済みログを gzip で圧縮します(.gz)
    compress

    # delaycompress
    #   → 直近1世代は圧縮せず、その次のローテーション時に圧縮します
    #   → ログを書き続けているプロセスがいる場合に使用します
    delaycompress

    # -----------------------------------------------
    #  エラー処理・空ファイル処理
    # -----------------------------------------------

    # missingok
    #   → 対象ログファイルが存在しなくてもエラーにしません
    missingok

    # notifempty
    #   → ログファイルが空の場合はローテーションをスキップします
    notifempty

    # -----------------------------------------------
    #  ファイル作成設定
    # -----------------------------------------------

    # create {パーミッション} {オーナー} {グループ}
    #   → ローテーション後に新しいログファイルを作成します
    create 0640 www-data www-data

    # dateext
    #   → ローテーション済みファイルのサフィックスを番号でなく日付にします
    #   → 例: app.log.2026-03-25.gz
    dateext

    # -----------------------------------------------
    #  ローテーション後に実行するスクリプト
    # -----------------------------------------------

    # postrotate ... endscript
    #   → ローテーション完了後に実行するシェルスクリプトを記述します
    #   → デーモンへのシグナル送信(ログファイルを再オープンさせる)に使います
    postrotate
        systemctl reload kyo-app 2>/dev/null || true
    endscript
}

# -----------------------------------------------
#  copytruncate を使う場合(プロセス再起動が困難な場合)
# -----------------------------------------------

/var/log/mai-app/*.log {
    daily
    rotate 14
    compress
    missingok
    notifempty

    # copytruncate
    #   → ファイルをコピーしてから元ファイルをゼロバイトに切り詰めます
    #   → ファイルディスクリプタを開いたままのプロセスへの影響を最小化します
    #   → postrotate でデーモンを再起動できない場合に使用します
    copytruncate
}

# -----------------------------------------------
#  su ディレクティブを使う場合
# -----------------------------------------------

/var/log/terry-app/*.log {
    daily
    rotate 30
    compress
    missingok

    # su {ユーザー} {グループ}
    #   → logrotate 自体をこのユーザー権限で実行します
    #   → root 以外のユーザーが所有するログに対して使用します
    su terry terry
    postrotate
        kill -HUP $(cat /var/run/terry-app.pid) 2>/dev/null || true
    endscript
}

構文一覧

ディレクティブ説明
daily毎日ローテーションします。
weekly毎週ローテーションします。
monthly毎月ローテーションします。
size {N}ファイルサイズが N(例: 100M)を超えたときにローテーションします。頻度指定より優先されます。
rotate {N}ローテーション済みファイルを N 世代分保持します。N+1 世代目は自動削除されます。
compressローテーション済みログを gzip で圧縮します。
delaycompress直近1世代の圧縮を次回まで遅延します。『compress』と組み合わせて使用します。
missingok対象ログファイルが存在しなくてもエラーにしません。
notifemptyログファイルが空の場合はローテーションをスキップします。
create {パーミッション} {ユーザー} {グループ}ローテーション後に指定した権限で新しいログファイルを作成します。
dateextローテーション済みファイルのサフィックスを連番でなく日付(例: .2026-03-25)にします。
postrotate / endscriptローテーション完了後に実行するシェルスクリプトを記述します。デーモンへのシグナル送信などに使います。
prerotate / endscriptローテーション実行前に走らせるスクリプトを記述します。
copytruncate元ファイルをコピーしてゼロバイトに切り詰めます。プロセスを再起動できない場合に使用します。
su {ユーザー} {グループ}logrotate をこのユーザー権限で実行します。root 以外が所有するログに対して指定します。
sharedscriptsワイルドカードで複数ファイルを指定した場合でも『postrotate』を1回だけ実行します。
dateformat {書式}『dateext』の日付フォーマットを指定します(例: -%Y%m%d)。
maxage {N}N 日を超えたローテーション済みファイルを削除します。
minsize {N}ファイルサイズが N に満たない場合はローテーションしません。頻度条件と AND で評価されます。

使用例

/etc/logrotate.d/kyo-app(アプリケーションログのローテーション設定)
# -----------------------------------------------
#  草薙京のWebアプリケーション用 logrotate 設定
#  /etc/logrotate.d/kyo-app
# -----------------------------------------------

/var/log/kyo-app/access.log
/var/log/kyo-app/error.log {

    # 毎日ローテーションします
    daily

    # 30世代分(約1ヶ月分)保持します
    rotate 30

    # ローテーション済みログを gzip で圧縮します
    compress

    # 直近1世代は圧縮を遅らせます
    # (アプリが書き込み中のファイルが圧縮されないようにするためです)
    delaycompress

    # ログファイルが存在しなくてもエラーにしません
    missingok

    # 空ファイルはスキップします
    notifempty

    # ローテーション後に新しいファイルを作成します
    create 0640 www-data www-data

    # ファイル名に日付を付けます(例: access.log-2026-03-25.gz)
    dateext

    # ワイルドカード指定時も postrotate を1回だけ実行します
    sharedscripts

    # ローテーション後に Nginx へ USR1 シグナルを送り
    # ログファイルを再オープンさせます
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) 2>/dev/null || true
    endscript
}

実行するコマンドは次の通りです。

$ sudo logrotate -d /etc/logrotate.d/kyo-app
WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/kyo-app
Allocating hash table for state file, size 64 entries
Adding /var/log/kyo-app/access.log
Adding /var/log/kyo-app/error.log

Handling 2 logs

rotating pattern: /var/log/kyo-app/access.log
 after 1 days (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/kyo-app/access.log
  log does not need rotating (log has been already rotated)

rotating pattern: /var/log/kyo-app/error.log
 after 1 days (30 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/kyo-app/error.log
  log does not need rotating (log has been already rotated)
$ sudo logrotate -v /etc/logrotate.d/kyo-app
reading config file /etc/logrotate.d/kyo-app
rotating log /var/log/kyo-app/access.log, log->rotateCount is 30
dateext suffix '-2026-03-25'
glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
renaming /var/log/kyo-app/access.log.29.gz to /var/log/kyo-app/access.log.30.gz (rotatecount 30, logstart 1, i 29),
...
compressing log with: /bin/gzip
$ sudo logrotate --force /etc/logrotate.d/kyo-app
(--force を付けると条件に関係なく強制的にローテーションします)
グローバル設定 /etc/logrotate.conf の確認と手動実行
# -----------------------------------------------
#  /etc/logrotate.conf のデフォルト設定を確認します
# -----------------------------------------------

cat /etc/logrotate.conf

実行するコマンドは次の通りです。

$ cat /etc/logrotate.conf
# see "man logrotate" for details

# global options do not affect preceding include directives

# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# system-specific logs may also be configured here

実装例は次の通りです。

# -----------------------------------------------
#  全設定を対象に logrotate を手動で実行します
# -----------------------------------------------

# デバッグモード(実際には何もしません)で全設定を確認します
sudo logrotate -d /etc/logrotate.conf

# ローテーション済みファイルの一覧を確認します
ls -lh /var/log/kyo-app/

# 状態ファイル(最終ローテーション日時の記録)を確認します
cat /var/lib/logrotate/status | grep kyo-app

実行するコマンドは次の通りです。

$ ls -lh /var/log/kyo-app/
total 2.1M
-rw-r----- 1 www-data www-data  48K Mar 25 09:12 access.log
-rw-r----- 1 www-data www-data  12K Mar 24 00:00 access.log-20260324.gz
-rw-r----- 1 www-data www-data   9K Mar 23 00:00 access.log-20260323.gz
-rw-r----- 1 www-data www-data   3K Mar 25 09:12 error.log
-rw-r----- 1 www-data www-data   1K Mar 24 00:00 error.log-20260324.gz
$ cat /var/lib/logrotate/status | grep kyo-app
"/var/log/kyo-app/access.log" 2026-3-25-0:0:0
"/var/log/kyo-app/error.log" 2026-3-25-0:0:0

概要

『logrotate』は cron または systemd タイマー(『logrotate.timer』)によって定期的に呼び出されます。ログファイルが際限なく増大するのを防ぎ、古いログを圧縮・削除することでディスク使用量を管理します。設定は『/etc/logrotate.conf』にグローバルなデフォルト値を記述し、『/etc/logrotate.d/』以下のファイルでアプリケーションごとに上書きするのが一般的です。『logrotate -d』のデバッグモードを活用すると設定が正しく認識されているかを安全に確認できます。ローテーション後にデーモンへシグナルを送る『postrotate』ブロックを忘れると、デーモンが古いファイルディスクリプタにログを書き続けるため注意が必要です。実際のシステムログの閲覧には journalctl も合わせて活用してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。