web-dev-qa-db-ja.com

ディレクトリとそのサブディレクトリ内のファイルのログローテーション

logrotateにディレクトリとそのすべてのサブディレクトリ内のログファイルを検討させることは可能ですか? (つまり、サブディレクトリを明示的にリストしない場合)。

63
ithinkihaveacat

サブディレクトリの深さはどれくらいですか?

/var/log/basedir/*.log /var/log/basedir/*/*.log {
    daily
    rotate 5
}

Basedir /のすべての。logファイルと、basedirの直接の子のすべての。logファイルをローテーションします。さらに1レベル深くする必要がある場合は、各レベルがカバーされるまで別の/var/log/basedir/*/*/*.logを追加します。

これは、満たされない制約(高い最小サイズ)を含む別のlogrotate構成ファイルを使用してテストし、その後、ログローテーションを詳細モードで実行することができます。

logrotate -d testconfig.conf

-dフラグは、ローテーションを検討している各ログファイルをリストします。

95
Dan R

私の場合、サブディレクトリの深さは警告なしに変更される可能性があるため、すべてのサブディレクトリを検索して各ディレクトリの構成エントリを作成するようにbashスクリプトを設定しました。

また、ローテーション後のサブディレクトリの構造を維持することも重要です。これは、ワイルドカード(@DanRの回答)ではできなかったようです。毎日ログローテーションを行う場合、このスクリプトを毎日のcronジョブに配置できます。

basedir=/var/log/basedir/
#destdir=${basedir} # if you want rotated files in the same directories
destdir=/var/log/archivedir/ #if you want rotated files somewhere else
config_file=/wherever/you/keep/it
> ${config_file} #clear existing config_file contents

subfolders = $(find ${basedir} -type d)

for ii in ${subfolders}
do
    jj=${ii:${#basedir}} #strip off basedir, jj is the relative path

    #append new entry to config_file
    echo "${basedir}${jj}/* {
        olddir ${destdir}${jj}/
        daily
        rotate 5
    }" >> ${config_file}

    #add one line as spacing between entries
    echo "\n" >> ${config_file}

    #create destination folder, if it doesn't exist
    [ -d ${destdir}${jj} ] || mkdir ${destdir}${jj}
done

@DanRが提案したように、logrotate -dでテストします

4
craq

古いスレッドですが、次のことができます。

/var/log/basedir/**/*.log {
    daily
    rotate 5
}

これらの2つの星は、0個以上のディレクトリと一致します。ただし、既にローテーションされているファイルをローテーションできるため、ローテーションするログファイルの定義方法には注意が必要です。ここでlogrotateのマニュアルを引用します。

ワイルドカードは注意して使用してください。 *を指定すると、logrotateは以前にローテーションされたファイルを含むすべてのファイルをローテーションします。これを回避する方法は、olddirディレクティブまたはより正確なワイルドカード(* .logなど)を使用することです。

2
bat_ventzi