33

私は現在、Cronによって作成されたOracle Recoverログファイルを整理する方法を考え出そうとしています...

現在、Oracle スタンバイ リカバリ プロセスは、次のコマンドを使用して 15 分ごとに Cron によって呼び出されます。

0,15,30,45 * * * * /data/tier2/scripts/recover_standby.sh SID >> /data/tier2/scripts/logs/recover_standby_SID_`date +\%d\%m\%y`.log 2>&1

これにより、次のようなファイルが作成されます。

$ ls -l /data/tier2/scripts/logs/
total 0
-rw-r--r-- 1 oracle oinstall 0 Feb  1 23:45 recover_standby_SID_010213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  2 23:45 recover_standby_SID_020213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  3 23:45 recover_standby_SID_030213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  4 23:45 recover_standby_SID_040213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  5 23:45 recover_standby_SID_050213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  6 23:45 recover_standby_SID_060213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  7 23:45 recover_standby_SID_070213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  8 23:45 recover_standby_SID_080213.log
-rw-r--r-- 1 oracle oinstall 0 Feb  9 23:45 recover_standby_SID_090213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 10 23:45 recover_standby_SID_100213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 11 23:45 recover_standby_SID_110213.log
-rw-r--r-- 1 oracle oinstall 0 Feb 12 23:45 recover_standby_SID_120213.log

私は基本的に、x日前より古いファイルを削除したいのですが、これにはlogrotateが最適だと思いました...

次の構成ファイルで logrotate を構成しました。

/data/tier2/scripts/logs/recover_standby_*.log {
    daily
    dateext
    dateformat %d%m%Y
    maxage 7
    missingok
}

望ましい結果を得るために欠けているものはありますか?

Crontab ログ ファイルから日付を削除し、logrotate でそのファイルをローテーションさせることができると思いますが、ログ ファイルの日付は、ログが生成された日を反映しません。つまり、010313 のリカバリは、 logrotate が 020313 で起動し、ファイルをローテーションしているため、日付は 020313 です...

他のアイデアはありますか?また、ご回答いただきありがとうございます。

よろしく

ギャビン

4

6 に答える 6

42

Logrotate は、ローテーションされたログ ファイル名の語彙的にソートされたリストの順序に従って、またファイルの経過時間 (ファイルの最終変更時刻を使用) に従ってファイルを削除します。

  • 回転は、回転するファイルの最大数です。ローテーションされたログ ファイルの数が多い場合、それらの名前は語彙的にソートされ、語彙的に最小のものは削除されます。

  • maxageは、ローテーションされたログ ファイルを削除するための別の基準を定義します。ローテーションされたログ ファイルは、指定された日数より古いものは削除されます。日付は、ファイル名ではなく、ファイルの最終変更時刻から検出されることに注意してください。

  • dateformatを使用すると、ローテーションされたファイルの日付に特定の書式を設定できます。マニュアルページには、フォーマットが語彙的に正しいソートをもたらすものであることが記されています。

  • dateyesterdayでは、ログ ファイル名に 1 日前の日付を使用できます。

日次ローテーション ファイルで指定された日数 (たとえば 7) を保持するには、値を 7 に設定する必要があり、ファイルが実際に毎日作成およびローテーションされる場合rotateは無視できます。maxage

ログの作成が数日間、たとえば 14 日間行われなかった場合でも、ローテーションされるログ ファイルの数は変わりません (7)。

maxage古いファイルを常に削除することで、「ログが生成されない」シナリオの状況を改善します。7 日間ログを生成しないと、ローテーションされたログ ファイルは存在しません。

dateformat語彙的にソートできないため、OPが示すように使用することはできません。めちゃくちゃにすると、dateformatおそらく、本当に必要としていた以外のローテーションされたログ ファイルが削除される可能性があります。

ヒント: コマンド ラインから logrotate-dを実行し、ドライ ランを実行するオプションを指定します。logrotate の動作はわかりますが、実際には何もしません。次に、(verbose) を使用して手動実行を実行し、実行されたことが目的の-vものであることを確認できるようにします。

解決策: cron によって作成されたログを消去する

コンセプトは次のとおりです。

cron にログ ファイルの作成と更新を任せます。dateext

/data/tier2/scripts/logs/recover_standby_SID.log-`date +\%Y\%m\%d`.log

古いログ ファイルを削除する場合にのみ logrotate を使用する

  • 存在しないログファイルを狙う/data/tier2/scripts/logs/recover_standby_SID.log
  • missingoklogrotate のクリーンアップを実行するために使用します
  • 保持するログ ファイルの数をカバーするのに十分な高さに設定rotateします (1 日に 1 つの「ローテーション」ログ ファイルがある場合は、少なくとも 7 つですが、9999 のように非常に高く設定しても問題ありません)。
  • 7 に設定maxageします。これにより、最終変更時刻が 7 日を超えるファイルが削除されます。
  • dateextlogrotate は、ローテーションされたように見える古いファイルを確実に検索するために使用されます。

Logrotate 構成ファイルは次のようになります。

data/tier2/scripts/logs/recover_standby_SID.log {
    daily
    missingok
    rotate 9999
    maxage 7
    dateext
}

解決策: 1 日 1 回 logrotate で直接ローテーションする

ソースリカバリスタンバイファイルがどのように作成されるかはわかりませんが、Oracleまたはあなたのスクリプトが定期的または継続的にファイルに追加されていると思います/data/tier2/scripts/logs/recover_standby_SID.log

コンセプトは次のとおりです。

  • ファイルを 1 日 1 回ローテーションするlogrotate
  • 回復データを含むログ ファイルを直接操作する/data/tier2/scripts/logs/recover_standby_SID.log
  • dailyは 1 日 1 回ローテーションを発生させます (cron理解の仕方に関してdaily)
  • rotate7 (またはそれ以上の数値) に設定する必要があります。
  • maxage7 (日) に設定
  • dateextデフォルトの logrotate 日付サフィックスを使用するには
  • dateyesterdayローテーションされたファイルの日付接尾辞が 1 日さかのぼるのに使用されていました。
  • missingokローテーションする新しいコンテンツが存在しない場合でも、古いファイルをクリーンアップします。

Logrotate の設定は次のようになります。

data/tier2/scripts/logs/recover_standby_SID.log {
    daily
    missingok
    rotate 7
    maxage 7
    dateext
    dateyesterday
}

copytruncateソースログファイルが外部プロセスによってどのように作成され、ローテーションの動作にどのように反応するかに関連する他の同様のオプションで少し遊ぶ必要があるかもしれないことに注意してください。

于 2014-12-19T12:56:26.763 に答える
30

コマンドを使用findして、そのタスクを簡単に実行できます。7 Days古いファイルはすべて削除されます。それを入れて、crontab毎晩実行します:

$ cd /data/tier2/scripts/logs/    
$ /usr/bin/find . -mtime +7 -name "*.log" -print -delete

またはより良い方法

$ /usr/bin/find /data/tier2/scripts/logs/ -mtime +7 -name "*.log" -print -delete;
于 2013-02-13T18:42:35.597 に答える
5

(更新) オプションは次のとおりです。

  • Satish が答えたように、logrotate を放棄し、find スクリプトを cron に入れます。
  • logrotate を使用して、検索スクリプトを postrotate コマンドに入れることもできます。

最初は、ログに合わせて日付形式を変更するとうまくいくかもしれないと思っていましたが、Reid Nabinger が指摘したように、日付形式はとにかく logrotate と互換性がありませんでした。最近、同じことを構成しようとしましたが、logrotate で削除したい Java ローテーション ログ用です。以下の構成を試しましたが、すべてのログを削除しようとし続けました

/opt/jboss/log/server.log.* {
    missingok
    rotate 0
    daily
    maxage 30
}

私は、Satishが提案したことを実装するだけになりました-cronでrmスクリプトを使用した簡単な検索です。

于 2013-10-04T17:05:33.793 に答える
3

(評判が足りないのでコメントできません)

同様の問題がありました。すべてのアカウントで logrotate は、日付スタンプが組み込まれたファイル名での使用には役に立ちません。

他のすべてが同じであれば、おそらくfindcron ジョブを使用するでしょう。

私自身の理由で、logrotate を使用したかったのですが、最終的に方法を見つけました: https://stackoverflow.com/a/23108631

要するに、これは cron ジョブを logrotate ファイルにカプセル化する方法でした。たぶん、最もきれいでも効率的でもないかもしれませんが、私が言ったように、私には理由がありました.

于 2014-07-19T07:34:23.693 に答える