一定期間経過したログファイルを削除する(ログローテーションを設定する)

    

ログファイルの保持期限の設定

ログファイルを7日分保持したいといった場合(ログを一定期間で削除したい場合)、logrotateコマンドを利用すると簡単に実現できます。ログファイルのようなテキストファイルだけでなくデータベースのバックアップファイル等にも利用可能です。
logrotateコマンドが見つからない場合は、下記のコマンドでインストールします。

yum install logrotate

logrotateの設定

logrotateの設定は「/etc/logrotate.d/」下にあるファイルを編集します。

apacheの設定例

インストール時に設定済みと思われるのでバックアップを作成してから編集を行います。

・ログ保持期間90日
・ログファイルの圧縮:あり (次回ローテート時に圧縮)

/etc/logrotate.d/httpd

/var/log/httpd/*log {
    
    daily
    rotate 90

    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript


}

missingok: ログファイルが存在しなくてもエラーを出さずに処理を続行
notifempty: ログファイルが空ならローテーションしない
delaycompress: ログの圧縮作業を次回のローテーション時まで遅らせる
sharedscripts: ログファイルに対しpostrotate/prerotateで記述したコマンドを実行
postrotate: ログローテーション後に実行するコマンド

logrotateの手動実行

ログローテーションを即時に実行したい場合は下記のコマンドを実行します。
/usr/sbin/logrotate -f ローテーション定義ファイル

apacheの場合

/usr/sbin/logrotate -f /etc/logrotate.d/httpd

logrotateの実行タイミング

設定ファイルにdailyやweekly、monthlyと記述があるので定期実行されることが想像できます。logrotateはcrondにより呼び出されています。
これらの実行時間の定義は下記のコマンドで調査することができます。

cat /etc/anacrontab

初回は空振り

logrotateでは前回ログローテーションを実行した時間が「/var/lib/logrotate.status」に記述されます。
登録直後はこのファイルにエントリがないためにローテーションが空振りします。日時実行の場合一度ローテーションを手動実行し、このファイルにエントリを追加させた後、前回実行日を前日に書き換えることで直近の夜間処理(実行時間は設定によります)で実行されます。
※ 前回実行日を書き換えるのは手動実行日から次のローテーションのタイミングが24時間後以内の場合実行済みと認識されないようにするためです。

任意の時間でローテーションしたい場合

ローテーション定義ファイルを「/etc/logrotate.d/」に置かず、任意のディレクトリに置いたうえで、cronで手動実行を行うコマンドを登録すると良いでしょう。

CentOS7でアプリケーションログのローテーションがうまくいかない場合

because parent directory has insecure permissionsといったエラーが発生しローテーションがうまくいかない場合、定義ファイルにローテーションを行う為のユーザを指定する

/path/to/application.log {

    daily
    rotate 10

    missingok
    notifempty
    sharedscripts
    delaycompress

    su apache apache

}