web-dev-qa-db-ja.com

ログローテートして、日付がスタンプされたファイルをクリーンアップします

私は現在、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のリカバリは020313でのlogrotateの起動とファイルのローテーションによる020313の日付...

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

よろしく

ギャビン

24
fatmcgav

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

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

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

  • dateformatは、ローテーションされたファイルの日付に特定のフォーマットを許可します。マニュアルページでは、形式は字句的に正しい並べ替えになるであることに注意してください。

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

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

ログの作成が数日間行われない場合、たとえば14日間、ローテーションされたログファイルの数は同じままです(7)。

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

dateformatは、語彙的にソートできないため、OPが示すように使用できません。 dateformatをいじると、おそらくあなたが本当に望んでいたもの以外の他のローテーションされたログファイルが削除されるでしょう。

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

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

コンセプトは:

Cronにログファイルの作成と更新を許可しますが、デフォルトのdateextを使用する場合は、logrotateの標準ファイル名に従って、ファイルを作成するために少し変更を加えます。

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

Logrotateは、古すぎるログファイルを削除する場合にのみ使用します

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

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回ローテーションを引き起こします(crondailyをどのように理解するかという点で)
  • rotateは7(またはそれ以上の数値)に設定する必要があります。
  • maxageは7(日)に設定
  • dateextはデフォルトのlogrotate日付サフィックスを使用します
  • dateyesterdayは、ローテーションされたファイルの日付サフィックスを1日前に戻すために使用されます。
  • missingokは、回転する新しいコンテンツが存在しない場合でも古いファイルを消去します。

Logrotateの構成は次のようになります。

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

copytruncateや、外部プロセスによるソースログファイルの作成方法と、ローテーションの動作に対する反応に関連するその他の同様のオプションを少し試す必要があることに注意してください。

30
Jan Vlcinsky

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;
18
Satish

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

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

当初、ログに一致するように日付形式を変更しても機能すると考えましたが、Reid Nabingerが指摘したように、いずれにしても日付形式はlogrotateと互換性がありませんでした。最近、同じことを設定しようとしましたが、Javaローテーションされたログでlogrotateで削除したいものです。以下の設定を試しましたが、すべてのログを削除しようとしました

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

私はサティシュが提案したものを実装することになりました-cronのrmスクリプトを使用した簡単な検索。

4
Lars Nordin

(評価が足りないとコメントできない)

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

他のすべてが等しい場合、おそらくcronジョブでfindを使用します。

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

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

3

@Jan Vlcinskyのように、logrotateに日付を追加させることができます-dateyesterdayを使用して正しい日付を取得してください。

または、日付を自分で入力したい場合は、日付のない名前を「狙う」ことができ、日付のある名前はクリーンアップされます。

ただし、ログファイルがない場合、logrotateは日付のあるファイルのクリーンアップを実行しません。

しかし、空のログファイルを用意する準備ができていれば、それを機能させることができます。

たとえば、/ var/log/mylogfileをクリーンアップするには、yyyymmdd。log 7日後に、touch /var/log/mylogfile.log、次にlogrotateを次のように構成します。

/var/log/mylogfile.log
{
 daily 
 rotate 7 
 maxage 7 
 dateext 
 dateformat。%Y% m%d 
 extension .log 
 ifempty 
 create 
} 

このエントリは、mylogfile.logの存在と組み合わされて、logrotateによって作成されたかのように古いファイルをクリーンアップするためにlogrotateをトリガーします。

dailyrotateおよびmaxageは、7日後に古いログファイル(または7つの古いログファイルのいずれか早い方)を削除します。

dateextdateformatおよびextensionにより、logrotateはファイル名と一致します。

そして、ifemptyプラスcreateは、そこに空のファイルが存在し続けることを確認します。そうしないと、ログのローテーションが停止します。

テストの別のヒントとして、/ var/lib/logrotate.statusを編集して「最終ローテート」日付をリセットする準備をしてください。そうしないと、logrotateは何もしません。

2
Ben Aveling

参考までにこれは古い質問ですが、あなたにとってうまくいかない理由は、dateformatが字句的にソートできないためです。マンページから:

   dateformat format_string
          Specify the extension for dateext using the notation similar to strftime(3)  function.  Only
          %Y  %m  %d  and %s specifiers are allowed.  The default value is -%Y%m%d. Note that also the
          character separating log name from the extension is part of the dateformat string. The  sys-
          tem  clock must be set past Sep 9th 2001 for %s to work correctly.  Note that the datestamps
          generated by this format must be lexically sortable (i.e., first the year,  then  the  month
          then  the  day.  e.g.,  2001/12/01 is ok, but 01/12/2001 is not, since 01/11/2002 would sort
          lower while it is later).  This is because when using the rotate option, logrotate sorts all
          rotated filenames to find out which logfiles are older and should be removed.

解決策は、年月日を変更するか、外部プロセスを呼び出してクリーンアップを実行することです。

1
Reid Nabinger