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
基本的な設定方法
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
# 個別設定ファイルの一覧を確認 ls /etc/logrotate.d/
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 }
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
強制実行(-f オプション):条件に関係なく即座にローテーションを実行します。
# 強制的にローテーションを実行 logrotate -f /etc/logrotate.d/myapp # 結果を確認 ls -la /var/log/myapp/
詳細出力(-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 }
sharedscriptsは重要なディレクティブです。ワイルドカードで複数のログファイルがマッチした場合、sharedscriptsがないとファイルごとにpostrotateが実行されてしまいます。sharedscriptsを指定すると、全ファイルのローテーション完了後に1回だけ実行されます。
copytruncateを使う場面
postrotateでサービスを再読み込みできない場合や、アプリケーション側にログファイルを開き直す仕組みがない場合は、copytruncateが有効です。# copytruncateを使う設定例 /var/log/myapp/app.log { daily rotate 7 compress delaycompress missingok notifempty 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
対処法1:ディレクトリの権限を修正する
# 親ディレクトリの権限を確認 ls -ld /var/log/myapp/ # 権限を修正(他ユーザーの書き込みを禁止) chmod 755 /var/log/myapp/
アプリケーション専用のディレクトリで、あえてroot以外の権限にしている場合は、設定ファイルにsuディレクティブを追加します。
# suディレクティブで実行ユーザーとグループを指定 /var/log/myapp/*.log { su myapp myapp daily rotate 7 compress missingok notifempty }
ログがローテーションされない時の確認手順
「設定したのにログがローテーションされない」場合は、以下の手順で原因を切り分けてください。手順1:ステータスファイルを確認する
logrotateは前回の実行日時を /var/lib/logrotate/logrotate.status(ディストリビューションによっては /var/lib/logrotate.status)に記録しています。
# ステータスファイルで前回の実行日時を確認 cat /var/lib/logrotate/logrotate.status | grep myapp
手順2:デバッグモードで設定を検証する
# 設定ファイルの構文エラーを確認 logrotate -d /etc/logrotate.d/myapp
手順3:cronまたはsystemdタイマーが動いているか確認する
# systemdタイマーの場合 systemctl status logrotate.timer systemctl list-timers | grep logrotate # cronの場合 ls -la /etc/cron.daily/logrotate
手順4:ディスク容量を確認する
ディスクが100%の状態では、ローテーション(新しいファイルの作成や圧縮)が失敗します。
# ディスク使用量を確認 df -h /var/log/
本記事のまとめ
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
