私は現在、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の日付...
他のアイデアはありますか?また、ご回答ありがとうございます。
よろしく
ギャビン
Logrotateは、ローテーションされたログファイル名の字句的にソートされたリストの順序、およびファイルの経過時間(ファイルの最終変更時刻を使用)に従ってファイルを削除します
rotateは、回転したファイルの最大数です。ローテーションされたログファイルの数が多い場合、それらの名前は字句的にソートされ、字句的に最も小さいものが削除されます。
maxageは、ローテーションされたログファイルを削除するための別の基準を定義します。指定された日数よりも古いローテーションされたログファイルは削除されます。日付は、ファイル名ではなく、ファイルの最終変更時刻から検出されることに注意してください。
dateformatは、ローテーションされたファイルの日付に特定のフォーマットを許可します。マニュアルページでは、形式は字句的に正しい並べ替えになるであることに注意してください。
dateyesterdayは、1日前のログファイル名に日付を使用できます。
毎日ローテーションされるファイルで指定された日数(7など)を保持するには、rotate
の値を7に設定する必要があります。ファイルが実際に毎日作成およびローテーションされる場合、maxage
を無視できます。
ログの作成が数日間行われない場合、たとえば14日間、ローテーションされたログファイルの数は同じままです(7)。
maxage
は、常に古すぎるファイルを削除することにより、「ログが生成されない」シナリオの状況を改善します。 7日間ログが生成されない場合、ローテーションされたログファイルは存在しません。
dateformat
は、語彙的にソートできないため、OPが示すように使用できません。 dateformat
をいじると、おそらくあなたが本当に望んでいたもの以外の他のローテーションされたログファイルが削除されるでしょう。
Tip:-d
オプションを指定してコマンドラインからlogrotateを実行し、ドライランを実行します。logrotateが何をするかがわかりますが、実際には何もしません。次に、-v
(詳細)を使用して手動で実行します。これにより、実行されていることが目的どおりであることを確認できます。
コンセプトは:
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
}
ソースリカバリスタンバイファイルはどのように作成されるのかわかりませんが、Oracleまたはあなたのスクリプトが定期的または継続的にファイルに追加されると思います/data/tier2/scripts/logs/recover_standby_SID.log
コンセプトは:
logrotate
ずつローテーションします/data/tier2/scripts/logs/recover_standby_SID.log
daily
は、1日に1回ローテーションを引き起こします(cron
がdaily
をどのように理解するかという点で)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
や、外部プロセスによるソースログファイルの作成方法と、ローテーションの動作に対する反応に関連するその他の同様のオプションを少し試す必要があることに注意してください。
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;
(更新)オプションは次のとおりです。
当初、ログに一致するように日付形式を変更しても機能すると考えましたが、Reid Nabingerが指摘したように、いずれにしても日付形式はlogrotateと互換性がありませんでした。最近、同じことを設定しようとしましたが、Javaローテーションされたログでlogrotateで削除したいものです。以下の設定を試しましたが、すべてのログを削除しようとしました
/opt/jboss/log/server.log.* {
missingok
rotate 0
daily
maxage 30
}
私はサティシュが提案したものを実装することになりました-cronのrmスクリプトを使用した簡単な検索。
(評価が足りないとコメントできない)
同様の問題がありました。すべてのアカウントで、logrotateは、組み込みの日付スタンプを持つファイル名では使用できません。
他のすべてが等しい場合、おそらくcronジョブでfind
を使用します。
私自身の理由で、私はlogrotateを使用したいと思い、最終的に方法を見つけました: https://stackoverflow.com/a/23108631
本質的には、cronジョブをlogrotateファイルにカプセル化する方法でした。おそらく最もきれいでも効率的でもないかもしれませんが、私が言ったように、私には理由がありました。
@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をトリガーします。
daily
、rotate
およびmaxage
は、7日後に古いログファイル(または7つの古いログファイルのいずれか早い方)を削除します。
dateext
、dateformat
およびextension
により、logrotateはファイル名と一致します。
そして、ifempty
プラスcreate
は、そこに空のファイルが存在し続けることを確認します。そうしないと、ログのローテーションが停止します。
テストの別のヒントとして、/ var/lib/logrotate.statusを編集して「最終ローテート」日付をリセットする準備をしてください。そうしないと、logrotateは何もしません。
参考までにこれは古い質問ですが、あなたにとってうまくいかない理由は、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.
解決策は、年月日を変更するか、外部プロセスを呼び出してクリーンアップを実行することです。