logrotateでLinuxのログを自動ローテーションする方法|設定ファイルの書き方とトラブル対処


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドK-O, システム管理コマンド, ディスク・デバイス管理コマンド > logrotateでLinuxのログを自動ローテーションする方法|設定ファイルの書き方とトラブル対処
「logrotateを設定したはずなのに、ログがローテーションされていない」「設定ファイルの書き方がよく分からない」

Linuxサーバーを運用していると、放置したログファイルがディスクを圧迫して障害につながることがあります。「ネットで調べればすぐ分かる」と思って検索しても、断片的な情報ばかりで結局うまく動かない、そんな経験はないでしょうか。

この記事では、logrotate(ログローテーション)の仕組みから設定ファイルの書き方、手動テスト、トラブル対処まで体系的に解説します。
この記事を読めば、ログ管理の不安を解消し、安定したサーバー運用ができるようになります。

なぜlogrotateが必要なのか

Linuxサーバーは稼働している限り、ログファイルを生成し続けます。Webサーバーのアクセスログ、メールサーバーのログ、認証ログなど、放置すれば際限なく肥大化します。

ログが肥大化すると、以下の問題が発生します。

ディスク容量の逼迫:/var/log が100%になるとサービスが停止する
ログ解析の困難:数GBのファイルをgrepするのは現実的ではない
バックアップの肥大化:不要な古いログまで毎回バックアップされる

logrotateは、これらの問題を自動的に解決する仕組みです。指定した条件(日数・サイズなど)に従ってログファイルを分割・圧縮・削除してくれます。

ほぼすべてのLinuxディストリビューションに標準でインストールされており、Apache、Nginx、syslogなど主要なサービスのログローテーション設定もパッケージに含まれています。

logrotateの仕組み(cronとの関係)

logrotateは常駐プロセス(デーモン)ではありません。cron(定期実行の仕組み)によって1日1回呼び出されて動作します。

具体的な流れは以下のとおりです。

・cronが毎日 /etc/cron.daily/logrotate を実行する
・logrotateが /etc/logrotate.conf を読み込む
・/etc/logrotate.conf の中で /etc/logrotate.d/ 配下の個別設定を読み込む(include)
・各設定ファイルの条件に従ってローテーションを実行する
・実行結果を /var/lib/logrotate/logrotate.status に記録する

RHEL/CentOS 7以降では、cronではなくsystemdタイマー(logrotate.timer)で実行される場合もあります。以下のコマンドで確認できます。

# systemdタイマーの状態を確認 systemctl status logrotate.timer # 従来のcronで動いているか確認 ls -la /etc/cron.daily/logrotate

どちらの方法でも、logrotateの設定ファイルの書き方は同じです。

基本的な設定方法

1. 設定ファイルの場所を確認する

logrotateの設定ファイルは2つの場所にあります。

/etc/logrotate.conf:全体のデフォルト設定ファイル
/etc/logrotate.d/:サービスごとの個別設定ファイルを格納するディレクトリ

まずは /etc/logrotate.conf の中身を確認してみましょう。

# デフォルト設定ファイルの内容を確認 cat /etc/logrotate.conf

典型的な内容は以下のようになっています。

# ローテーション間隔(週1回) weekly # 保持する世代数(4世代) rotate 4 # ローテーション後に新しい空ファイルを作成 create # 古いログを圧縮 compress # /etc/logrotate.d/ 配下の設定を読み込み include /etc/logrotate.d

/etc/logrotate.d/ には、RPMパッケージがインストール時に自動的に設定ファイルを配置します。

# 個別設定ファイルの一覧を確認 ls /etc/logrotate.d/

httpd、nginx、syslog、postfixなど、インストール済みサービスの設定ファイルが並んでいるはずです。

2. 個別の設定ファイルを作成する

独自のアプリケーションログなど、自分で設定を追加したい場合は /etc/logrotate.d/ に新しいファイルを作成します。

以下は、/var/log/myapp/ 配下のログを管理する設定例です。

# /etc/logrotate.d/myapp の設定例 /var/log/myapp/*.log { daily rotate 14 compress delaycompress missingok notifempty create 0640 myapp myapp }

設定ファイル名に拡張子は不要です。ファイル名にドット(.)やチルダ(~)が含まれていると、logrotateが読み飛ばすので注意してください。

3. 主要なディレクティブを理解する

設定ファイルで使う主要なディレクティブ(設定項目)を解説します。

ローテーション間隔

daily:毎日ローテーション
weekly:毎週ローテーション
monthly:毎月ローテーション

保持とサイズ

rotate 数値:保持する世代数。rotate 7 なら7世代分を保持し、それより古いものは削除される
size サイズ:指定サイズを超えた場合のみローテーション(例:size 100M)
maxsize サイズ:daily/weeklyと併用し、指定サイズを超えたら間隔を待たずにローテーション
minsize サイズ:daily/weeklyと併用し、指定サイズ未満ならローテーションしない

圧縮

compress:ローテーション後のログをgzip圧縮する
delaycompress:圧縮を1世代遅らせる。直前のログはすぐ参照したいことが多いため、実務ではcompressとセットで使うのが定番
nocompress:圧縮しない

ファイル生成と権限

create モード オーナー グループ:ローテーション後に指定した権限で新しい空ファイルを作成する(例:create 0640 root adm)
nocreate:新しいファイルを作成しない

エラー制御

missingok:ログファイルが存在しなくてもエラーにしない
notifempty:ログファイルが空ならローテーションしない

4. 手動でローテーションをテストする

設定ファイルを作成したら、いきなり本番で動かすのではなく、必ずテストしましょう。

デバッグモード(-d オプション):実際にはローテーションせず、何が実行されるかを表示します。

# デバッグモードで設定をテスト(実際のローテーションは行われない) logrotate -d /etc/logrotate.d/myapp

「rotating pattern: /var/log/myapp/*.log ...」のような出力が表示されれば、設定は正しく読み込まれています。エラーが表示された場合は設定ファイルの構文を確認してください。

強制実行(-f オプション):条件に関係なく即座にローテーションを実行します。

# 強制的にローテーションを実行 logrotate -f /etc/logrotate.d/myapp # 結果を確認 ls -la /var/log/myapp/

-d で問題がないことを確認してから -f で実行する、という手順を守れば安全です。

詳細出力(-v オプション):-f と組み合わせると、実行中の詳細な情報が表示されます。

# 詳細情報を表示しながら強制ローテーション logrotate -vf /etc/logrotate.d/myapp

応用・実務Tips

postrotateでサービスを再読み込みする

ログファイルをローテーションした後、サービスに「新しいログファイルに書き込んでくれ」と通知する必要がある場合があります。

たとえばApache(httpd)は、起動時にログファイルを開いたまま書き込み続けます。ファイル名が変わっても古いファイルディスクリプタ(ファイルの参照情報)を使い続けるため、postrotateでサービスを再読み込みする必要があります。

# /etc/logrotate.d/httpd の設定例 /var/log/httpd/*log { daily rotate 14 compress delaycompress missingok notifempty sharedscripts postrotate /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true endscript }

postrotateとendscriptの間に記述したコマンドが、ローテーション後に実行されます。

sharedscriptsは重要なディレクティブです。ワイルドカードで複数のログファイルがマッチした場合、sharedscriptsがないとファイルごとにpostrotateが実行されてしまいます。sharedscriptsを指定すると、全ファイルのローテーション完了後に1回だけ実行されます。

copytruncateを使う場面

postrotateでサービスを再読み込みできない場合や、アプリケーション側にログファイルを開き直す仕組みがない場合は、copytruncateが有効です。

# copytruncateを使う設定例 /var/log/myapp/app.log { daily rotate 7 compress delaycompress missingok notifempty copytruncate }

copytruncateの動作は以下のとおりです。

1. 元のログファイルをコピーしてバックアップを作成する
2. 元のログファイルの中身を空にする(truncate)

ファイル名やiノード(ファイルの識別番号)が変わらないため、アプリケーション側の対応は不要です。

ただし、コピーとtruncateの間に書き込まれたログが失われる可能性がゼロではありません。ミッションクリティカルなログには使わず、postrotateでの再読み込みを優先してください。

独自アプリケーションのログをローテーションする

自作のアプリケーションやバッチ処理のログをlogrotateで管理する場合の設定例を紹介します。

# /etc/logrotate.d/myapp-batch /var/log/myapp/batch_*.log { weekly rotate 12 compress delaycompress missingok notifempty create 0644 appuser appuser olddir /var/log/myapp/archive dateext dateformat -%Y%m%d }

ここで使っているディレクティブを補足します。

olddir:ローテーション後のファイルを指定ディレクトリに移動する。olddirは事前に作成しておく必要がある
dateext:ローテーション後のファイル名に日付を付与する(例:batch_job.log-20260323.gz)
dateformat:dateextで使う日付書式を指定する

olddirを使うと、現在のログと過去のログを分離できるため、運用がすっきりします。

トラブルシュート・エラー対処

「error: skipping」が出た時の対処法

logrotateを実行した際に以下のようなエラーが出ることがあります。

error: skipping "/var/log/myapp/app.log" because parent directory has insecure permissions

これは、ログファイルの親ディレクトリのパーミッション(アクセス権限)が安全でないとlogrotateが判断した場合に発生します。

対処法1:ディレクトリの権限を修正する

# 親ディレクトリの権限を確認 ls -ld /var/log/myapp/ # 権限を修正(他ユーザーの書き込みを禁止) chmod 755 /var/log/myapp/

対処法2:su ディレクティブで実行ユーザーを指定する

アプリケーション専用のディレクトリで、あえてroot以外の権限にしている場合は、設定ファイルにsuディレクティブを追加します。

# suディレクティブで実行ユーザーとグループを指定 /var/log/myapp/*.log { su myapp myapp daily rotate 7 compress missingok notifempty }

suディレクティブを追加すると、logrotateがそのユーザー権限でローテーションを実行するため、パーミッションエラーが解消されます。

ログがローテーションされない時の確認手順

「設定したのにログがローテーションされない」場合は、以下の手順で原因を切り分けてください。

手順1:ステータスファイルを確認する

logrotateは前回の実行日時を /var/lib/logrotate/logrotate.status(ディストリビューションによっては /var/lib/logrotate.status)に記録しています。

# ステータスファイルで前回の実行日時を確認 cat /var/lib/logrotate/logrotate.status | grep myapp

前回の実行日時が記録されていない場合は、設定ファイルがlogrotateに認識されていない可能性があります。

手順2:デバッグモードで設定を検証する

# 設定ファイルの構文エラーを確認 logrotate -d /etc/logrotate.d/myapp

「error:」で始まる行がないかチェックしてください。

手順3:cronまたはsystemdタイマーが動いているか確認する

# systemdタイマーの場合 systemctl status logrotate.timer systemctl list-timers | grep logrotate # cronの場合 ls -la /etc/cron.daily/logrotate

logrotate.timerが inactive になっていたり、/etc/cron.daily/logrotate が存在しない場合は、logrotate自体が定期実行されていません。

手順4:ディスク容量を確認する

ディスクが100%の状態では、ローテーション(新しいファイルの作成や圧縮)が失敗します。

# ディスク使用量を確認 df -h /var/log/

ディスクが逼迫している場合は、まず不要なファイルを削除してからlogrotateを実行してください。

本記事のまとめ

logrotateの設定方法とトラブル対処のポイントを整理します。
やりたいこと コマンド・設定
デフォルト設定を確認する cat /etc/logrotate.conf
個別設定ファイルの一覧を確認する ls /etc/logrotate.d/
設定をテストする(実行しない) logrotate -d /etc/logrotate.d/設定名
強制的にローテーションを実行する logrotate -f /etc/logrotate.d/設定名
詳細表示で強制ローテーションする logrotate -vf /etc/logrotate.d/設定名
前回の実行日時を確認する cat /var/lib/logrotate/logrotate.status
systemdタイマーの状態を確認する systemctl status logrotate.timer
ローテーション後にサービスを再読み込みする postrotate ~ endscript で設定
アプリ側の対応なしでローテーションする copytruncate ディレクティブで設定

ログ管理だけでなく、サーバー運用を体系的に学びたいと思いませんか?

logrotateはサーバー運用の基本ですが、実際の現場ではログ管理以外にも権限設定・セキュリティ・バックアップなど、総合的な知識が求められます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る