logadm - 無限に拡大するログファイルの管理
logadm
logadm [-options] logname...
logadm は、cron(1M) から実行するのに適した一般的なログローテーションツールです。
引数がない場合、logadm は /etc/logadm.conf ファイルを読み取り、そのファイルで見つかったエントリごとに、対応するログファイルをローテーションするべきかどうかを確認します。通常、この確認はルートの crontab 内のエントリによって毎朝実行されます。
logname 引数が指定されている場合、logadm は対応するログファイルの名前に接尾辞を追加して、最新のログファイルが .0 で終わり (つまり、logfile .0)、その次に新しいものが .1 で終わる (つまり、logfile.1)、などとなるように変更します。デフォルトでは、古いログファイルが 10 バージョン保持されます (つまり、logfile .0 から logfile .9 まで)。11 番目のログファイルが記録される時点で、logadm はもっとも古いバージョンを自動的に削除して、ファイル数を 10 に保ちます。
logadm はいくつかの options をとります。これらのオプションは、コマンド行または /etc/logadm.conf ファイルで指定できます。logadm コマンドは、/etc/logadm.conf で logname options という形式の行を検索します
/etc/logadm.conf 内のエントリを指定します。これには、名前またはログファイルのパス名を指定できます。このフィールドに名前ではなくログファイルを指定する場合は、完全修飾パス名でなければいけません。
コマンド行で入力されるものとまったく同じコマンド行オプションを指定します。これにより、一般的に使用されるログローテーションポリシーを /etc/logadm.conf ファイルに格納できるようになります。「使用例」を参照してください。
/etc/logadm.conf とコマンド行の両方に options が指定されている場合は、/etc/logadm.conf ファイル内のものが最初に適用されます。したがって、/etc/logadm.conf 内のオプションはコマンド行のオプションによってオーバーライドされます。
/etc/logadm.conf 内に指定するログファイル名には、csh(1) でサポートされている * や ? などのファイル名置換文字を含めることができます。
ログファイルがいつローテーションされるかは、2 つのオプションで制御されます。それは –s size –p period です。
これらのオプションを同時に複数使用する場合は、それらの間に論理積が存在すると見なされます。つまり、ログがローテーションされるには、すべての条件が満たされる必要があります。
これら 2 つのオプションがどちらも指定されていない場合、ログファイルのローテーションのデフォルト条件は –s 1b – p 1w で、これは、サイズが 0 以外で、かつ最後のローテーションから少なくとも 1 週間が経過した場合のみ、ログファイルがローテーションされることを意味します。
ローテーション条件として –p never を指定すると、ほかのローテーション条件はすべて無視され、logadm は古いログファイルの期限切れに進みます。ローテーション条件として –p now を指定すると、ログが強制的にローテーションされます。
–o、–g、または –m オプションで指定されている場合を除き、logadm は元のファイルと同じ所有者、グループ ID、およびアクセス権を持つ空のファイルを作成して、ログファイルを置き換えます (名前を変更したあと)。
ログファイルがいつ期限切れになるかは、–A age – C count –S size の 3 つのオプションで制御されます。これらのオプションは、特定の条件が満たされるまで、もっとも古いログファイルを期限切れにします。たとえば、–C 5 および –S 10m オプションを組み合わせると、ファイル数が 5 以下かつそれらの合計のディスク使用量が 10 メガバイト以下になるまで、古いログファイルが期限切れにされます。これらのオプションがどれも指定されていない場合、デフォルトの期限切れは –C 10 であり、これによって 10 個の古いログファイルが保持されます。どのファイルも期限切れにならないようにするには、デフォルトによる期限切れを回避するために –C 0 を使用します。
logadm はタイムスタンプをファイル /var/logadm/timestamps に格納します。ユーザーが以前のバージョンの logadm を使用していた場合、このユーティリティーは、ユーザーの以前のリポジトリ /etc/logadm.conf から /var/logadm/timestamps にタイムスタンプを自動的に移動します。
サポートしているオプションは、次のとおりです。
ログファイル名の変更後に post_command を実行します。post_command は sh –c に渡されます。
post_command には、有効なシェルコマンドを指定します。post_command 内の空白やシェルのメタキャラクタを保護するには、引用符を使用します。
このオプションを使用して、ファイルに書き込んでいるデーモンを再起動できます。1 つの logadm コマンドで複数のログがローテーションされる場合は、ローテーションされるログごとに 1 回ではなく、すべてのログがローテーションされたあとに 1 回だけ post_command が実行されます。
age で指定された時間だけ変更されていないバージョンをすべて削除します。
age には、数値に続いて h (時間)、d (日)、w (週)、m (月)、または y (年) を指定します。
ログファイル名の変更前に pre_command を実行します。pre_command は sh –c に渡されます。
pre_command には、有効なシェルコマンドを指定します。pre_command 内の空白やシェルのメタキャラクタを保護するには、引用符を使用します。
このオプションを使用して、ファイルに書き込んでいるデーモンを停止できます。1 つの logadm コマンドで複数のログがローテーションされる場合は、ローテーションされるログごとに 1 回ではなく、すべてのログがローテーションされる前に 1 回だけ pre_command が実行されます。
ファイル名を変更するのではなく、ログファイルをコピーし、元のログファイルを長さ 0 に切り詰めることによって、ログファイルをローテーションします。
残っているファイルの数が count 以下になるまで、もっとも古いバージョンを削除します。
期限切れオプション (–A、–C、または –S) が指定されていない場合は、–C 10 がデフォルトです。デフォルトの期限切れルールが自動的に追加されることを回避するには、–C 0 を指定します。
mail_addr にエラーメッセージを電子メールで送信します。
通常 logadm は cron(1M) から実行されるため、エラーメッセージは cron によって取得され、crontab の所有者にメールで送信されます。
このオプションは、エラーメッセージに関するメールを代わりに別のアドレスに送信する場合に役立ちます。エラーが発生しなかった場合、メールメッセージは生成されません。
古いログファイルを削除して期限切れにするのではなく、cmd を実行してファイルを期限切れにします。
cmd は sh –c に渡されます。cmd の完了後、ファイルは期限切れと見なされます。cmd によって古いログファイルの削除または名前の変更が行われない場合、logadm では、指定のログファイルに対する次回の実行時に古いログファイルが期限切れになると見なされます。指定されている場合、キーワード $file は、指定された cmd 内で期限切れにされるファイルの名前に展開されます。
このオプションは、古いログファイルを管理者にメールで送信したり、古いログファイルを長期ストレージにコピーしたりするタスクに役立ちます。
/etc/logadm.conf の代わりに conf_file を使用します。
このオプションを使用すると、root 以外のユーザーが独自の logadm 構成ファイルを保持できます。
/var/logadm/timestamps の代わりに timestamp_file を使用して、logadm のタイムスタンプを格納します。
ログファイルのグループ ID を保持する代わりに、group で指定された ID を使用して、新しい空のファイルを作成します。
group には、chgrp (1) で受け入れられる名前または数値グループ ID を指定します。
このオプションには、chgrp(1) コマンドを使用してファイルのグループ所有権を変更する権限が必要です。
logadm のオプションを説明するヘルプメッセージを表示します。
ローテーションされたログファイルに名前を付けるときに、協定世界時 (UTC) ではなくローカル時間を使用します (–t オプションに指定されるテンプレート内のパーセントシーケンスに関する説明を参照)。
ログファイルのモードを保持する代わりに、mode で指定されたモードを使用して、新しい空のファイルを作成します。
mode は、chmod(1) コマンドで受け入れられるいずれかの形式で指定します。
cmd を使用してログファイルの名前を変更します。キーワード $file が指定されている場合、それはログファイルの名前に展開されます。同様に、キーワード $nfile はログファイルの新しい名前に展開されます。$nfile は、–M オプションに指定されるコマンドでのみ使用できます。コマンドの完了後、ローテーションされたファイルによってログファイルが置き換えられます。デフォルトの cmd は「/bin/mv $file$nfile」です。
logadm コマンドが実行するアクションを、実際には実行せずに表示します。
このオプションは、システムに変更を加える前に引数を確認する場合に役立ちます。
ただし、このオプションではログのローテーションアクションが表示されるだけなので、logadm では期限切れにする必要のあるファイルが見つからないことがありますが、–n なしで logadm で実行すると、ログのローテーションアクションが実行されて、期限切れにする必要のあるファイルが作成される場合があることに注意してください。したがって、–n オプションを指定すると期限切れになるファイルが表示されない場合でも、指定しないとファイルが期限切れになる場合もあります。
指定されたログファイルが存在しない場合にエラーメッセージを回避します。通常、logadm はログファイルが見つからない場合にエラーメッセージを生成します。–N を指定すると、ログファイルが存在しない場合、logadm は期限切れルール (もしあれば) に進み、それから次のログファイル (もしあれば) に進み、空の置換ログファイルは作成しません。
ログファイルの所有者を保持する代わりに、owner を使用して、新しい空のファイルを作成します。
owner は、chown(1) コマンドで受け入れられるいずれかの形式で指定します。
指定された期間 (period) のあとでログファイルをローテーションします。
period には、数値に続いて d (日)、h (時間)、w (週)、m (月) (30 日)、または y (年) を指定します。period には 2 つの特別な値 now と never もあります。「–p now」は強制的にログローテーションを行います。「–p never」はログローテーションを強制的に行いません。
ログが最後にローテーションされた時間を /var/logadm/timestamps に記録するために logadm で使用されます。
このオプションは、ログのローテーション期間が経過したかどうかを判定するために timestamp を使用します。timestamp の形式は ctime(3C) によって生成される形式と同じで、埋め込まれた空白を保護するために引用符で囲まれます。timestamp は常に協定世界時 (UTC) タイムゾーンで記録されます。
指定された logname に対応するすべてのエントリを /etc/logadm.conf から削除します。
ログのローテーションによって古いログファイルが作成されるときに cmd を実行します。指定されたコマンドにキーワード $file が埋め込まれている場合、それはログのローテーションによって作成されたばかりの古いログファイルの名前に展開されます。
このオプションは、ログのローテーションのあとでログファイルの内容を処理する場合に役立ちます。cmd は sh –c に渡されて実行されます。1 つの logadm コマンドで複数のログがローテーションされる場合は、ログがローテーションされるたびに 1 回、–R で指定されたコマンドが実行されます。これはログファイルの後処理に役立ちます (ソート、関心を引かない行の削除、など)。ログのローテーションのあとでデーモンを再起動するには、–a オプションの方が適しています。
ログファイルのサイズが size 以上の場合のみ、そのファイルをローテーションします。
size には、数値に続いて文字 b (バイト)、k (K バイト)、m (M バイト)、または g (G バイト) を指定します。
古いログファイルで使用されている合計ディスク容量が指定されたサイズ未満になるまで、もっとも古いバージョンを削除します。
size には、数値に続いて文字 b (バイト)、k (K バイト)、m (M バイト)、または g (G バイト) を指定します。
ログファイルの名前を変更するときに使用するテンプレートを指定します。
template には、/var/adm/oldfile などの単純な名前を指定するか、logadm で展開される $ word 形式の特殊なキーワードを含めることができます。使用できるシーケンスは次のとおりです。
ディレクトリ名を含まないログファイル名
ローテーションするファイルのディレクトリ
domainname の出力に展開されます
ローテーションするファイルのフルパス名
uname –p の出力に展開されます
uname –m の出力に展開されます
バージョン番号で、最新が 0、その次に新しいものが 1 などとなります
$n と同じですが、0 ではなく 1 から始まります
uname –n の出力に展開されます
uname –i の出力に展開されます
uname –r の出力に展開されます
1970 年 1 月 1 日の 00:00:00 UTC から数えた秒数
zonename(1) の出力に展開されます。
実際のドル記号文字をファイル名に含めるには、$$ を使用します。strftime(3C) で使用できるパーセントシーケンスもすべて使用でき、たとえば、%d は月の日付に展開されます。実際のパーセント記号文字をファイル名に含めるには、%% を使用します。ドル記号キーワードとパーセントシーケンスの両方を、テンプレートの任意の場所に含めることができます。テンプレートから結果として得られたパス名に存在しないディレクトリが含まれている場合、それらはログファイルのローテーション時に必要に応じて作成されます。
–t オプションが指定されていない場合、デフォルトのテンプレートは $file.$n です。ログファイルの実際のローテーション は $n キーワードを使用して実行され、各バージョンが期限切れになるまで上へシフトされます。テンプレートに $n キーワードが含まれていない場合は、単にログファイルの名前が新しい名前に変更されたあと、期限切れルールがあればそれらが適用されます。
通常、logadm はテンプレート (–t オプションで指定) をパターンに変換し、そのパターンに一致する名前を持つ既存ファイルを見つけることによって、古いログファイルのリストを探します。–T オプションにより、指定のパターンが代わりに使用されるようになります。
このオプションは、時間の経過とともに cron ジョブで圧縮する場合など、別のプログラムが古いログファイルの名前を操作する場合に役立ちます。パターンは、csh(1) のファイル名置換でサポートされている * や ? などの特殊文字をパス名に付加した形式です。
実行されるアクションに関する情報を冗長モードで表示します。
構成ファイルを検証します。
このオプションは、指定された logname に対応するエントリが /etc/logadm.conf ファイルに存在することと、構文的に正しいことを検証します。logname が指定されていない場合は、構成ファイル内のすべてのエントリが検証されます。logname 引数が指定されている場合、このコマンドはそのエントリの構文を検証します。エントリが見つかった場合は、それが表示され、コマンドの終了値は true になります。それ以外の場合、終了値は false です。
現在のコマンド行引数に対応するエントリを構成ファイル (つまり、/etc/logadm.conf) に書き込みます。指定された entryname に対応するエントリがすでに存在する場合は、まずそれが削除されます。構文エラーが回避されるため、/etc/logadm.conf の更新にはこの方法をお勧めします。entryname は logadm の呼び出しの引数です。entryname には、覚えやすい名前を選択するか、ログファイルのパス名を指定できます。名前ではなくパス名を使用する場合は、完全修飾パス名でなければいけません。
logadm コマンド行にログファイル名が指定されていない場合、エントリ名はログファイル名と同じであると見なされます。たとえば、次の 2 行で達成されることは同じで、ローテーションされたログファイルのコピーが 2 つ保持されます。
% logadm -C2 -w mylog /my/really/long/log/file/name % logadm -C2 -w /my/really/long/log/file/name
ほかのすべてのコマンドが実行されたあと、古いログファイルを圧縮します。count 個の最新ログファイルは圧縮されないため、count 個の最新ファイルはより簡単に調査できます。count として 0 を使用すると、すべての古いログが圧縮されます。
圧縮は gzip (1) で実行され、結果として得られるログファイルの接尾辞は .gz になります。
0 のカウントを使用すると、まだファイルにロギングしているデーモンと、すでにそのファイルを圧縮している gzip の間で競合状態が発生する可能性があることに注意してください。この状況は、たとえば、デーモンが -a post_command から、開かれているログファイルをリフレッシュするよう指示された場合に発生する可能性があります。
logadm -z 0 -a 'kill -HUP <pid>'
圧縮は、デーモンが HUP シグナルの処理を完了する前であっても開始される可能性があります。この場合、ユーザーはログファイルで次のメッセージを確認できます。
gzip: /var/adm/messages.0: file size changed while zipping
回避方法としては、–z 1 を使用するか、または HUP シグナルを送信したあとに十分に長い遅延 (「sleep 10」など) を設定します。
次のオペランドがサポートされています。
/etc/logadm.conf 内のエントリの名前を指定します。logname フィールドにログファイル名が指定されている場合、logname は実際のログファイル名と同じであると見なされます。
次の例は、/var/adm/exacct/proc ファイルをローテーションし、以前のバージョン 10 個を /var/adm/exacct/proc.0 から /var/adm/exacct/proc.9 に保持します。
ファイルをコピーして切り詰めるように logadm に指示します。
% logadm -c /var/log/syslog使用例 2 syslog をローテーションする
次の例は、syslog をローテーションし、8 個のログファイルを保持します。古いログファイルはディレクトリ /var/log ではなく /var/oldlogs に置かれます。
% logadm -C8 -t'/var/oldlogs/syslog.$n' /var/log/syslog使用例 3 /var/adm/sulog をローテーションし、経過時間に基づいて期限切れにする
/etc/logadm.conf ファイル内の次のエントリは、/var/adm/sulog ファイルをローテーションし、30 日より古いコピーをすべて期限切れにします。
/var/adm/sulog -A 30d使用例 4 ファイルをローテーションし、ディスク使用量に基づいて期限切れにする
/etc/logadm.conf ファイル内の次のエントリは、/var/adm/sulog ファイルをローテーションし、ローテーションされたすべてのログファイルで使用されている合計が 100 M バイトを超えると、古いログファイルを期限切れにします。
/var/adm/sulog -S 100m使用例 5 ログファイル名を格納するエントリを作成する
この例では、ログファイル名を格納するエントリを作成し、20 個のコピーを /etc/logadm.conf に保持したいのですが、–p never により、ルートの crontab から毎朝実行される通常の logadm ではこのエントリが無視されます。
% logadm -w locallog /usr/local/logfile -C20 -p never
コマンド行で次のエントリを使用して –p never オプションをオーバーライドします。
% logadm -p now locallog使用例 6 apache エラーログおよびアクセスログをローテーションする
次の例は、apache エラーログおよびアクセスログを毎月ローテーションして、現在の年と月に基づくファイル名にします。24 個の最新コピーを保持し、ログの名前を変更したあとで再起動するように apache に指示します。
このコマンドは 1 回実行され、–w オプションが指定されているため、今後 apache のログがローテーションされるようにするエントリが /etc/logadm.conf 内に作成されます。
% logadm -w apache -p 1m -C 24\ -t '/var/apache/old-logs/$basename.%Y-%m'\ -a '/usr/apache/bin/apachectl graceful'\ '/var/apache/logs/*{access,error}_log'
この例は、–w オプションで指定されるエントリ名はログファイル名に一致する必要がないことも示しています。この例では、エントリ名は apache であり、この行が実行されたあとで次のコマンドを実行すると、/etc/logadm.conf 内のこのエントリが強制的に実行されるようになります。
% logadm -p now apache
apache ログファイル名を照合する表現は引用符で囲まれていたため、それを展開したファイルのリストではなく、表現が /etc/logadm.conf ファイルに格納されます。つまり、logadm は cron から実行されるたびに、その表現を展開し、結果として得られたリスト内のすべてのログファイルについて、ローテーションが必要かどうかを確認します。
次のコマンドは、ログ名の表現を引用符で囲まない例です。シェルによって、最後の引数がコマンドの入力時に存在していたログファイルのリストに展開され、それらのファイルをローテーションするエントリが /etc/logadm.conf に書き込まれます。
% logadm -w apache /var/apache/logs/*_log
logadm コマンドの構成ファイル
タイムスタンプを記録するためのリポジトリ
属性についての詳細は、マニュアルページの attributes(5) を参照してください。
|
chgrp(1)、chmod(1)、chown(1)、csh(1)、gzip (1)、cron(1M)、ctime(3C)、strftime(3C)、logadm.conf(4)、attributes(5)
logadm は、期限切れ条件 (–A、–C、および –S オプションで指定) を適用する場合、条件が満たされるまで、もっとも古いものから順にファイルを削除します。古いログの名前付けに使用されるテンプレートに $n または $N が含まれていた場合、logadm は、古いログファイルの名前で見つかったもっとも大きい $n 値または $N 値を最初に選択します。ほかのテンプレートが使用されている場合、logadm は変更時間を使用して、最初に期限切れにするファイルを判定します。古いログファイルがローテーション後に変更されている場合、これは予期しない動作になることがあります。
ログファイルのサイズとログファイルの数によっては、ログファイルのローテーションに非常に長い時間がかかる可能性があります。
デフォルトでは、logadm は UTC で動作します。したがって、/etc/logadm.conf ファイル (logadm.conf(4) を参照) に書き込まれるすべてのエントリに UTC タイムスタンプが付加されます。ユーザーは –l オプションを使用して logadm をローカル時間に設定できます。
–f および –F オプションで同じファイルを指定することができ、その場合、logadm は以前のリリースと同じ動作に戻ります。つまり、タイムスタンプは構成ファイルに書き込まれます。