我目前正在试图找出一种整理由Cron创build的Oracle Recover日志文件的方法…
目前,我们的Oracle备用恢复过程由Cron每隔15分钟使用以下命令调用:
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
这会创build如下所示的文件:
$ 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将是完美的…
我已经用下面的configuration文件configuration了logrotate:
/data/tier2/scripts/logs/recover_standby_*.log { daily dateext dateformat %d%m%Y maxage 7 missingok }
有什么我错过了想要的结果吗?
我想我可以从Crontab日志文件中删除date,然后用logrotate旋转该文件,然后日志文件中的date不会反映日志生成的date…即010313上的恢复将在文件中020313由于logrotate在020313上触发和旋转文件的date…
任何其他的想法? 并预先感谢您的任何回应。
问候
加文
Logrotate根据循环日志文件名的词法排序列表中的顺序来删除文件,也可以根据文件时间(使用文件的上次修改时间)
旋转是最大数量的旋转文件,你可能会发现。 如果旋转的日志文件数量较多,则将其名称进行词汇排序,删除词汇最小的文件。
maxage定义了另一个删除旋转日志文件的标准。 任何旋转的日志文件,比给定的天数更旧被删除。 请注意,日期是从文件上次修改时间检测到的,而不是从文件名中检测到的。
dateformat允许特定格式的日期旋转的文件。 手册页注意, 格式应导致词法正确的排序 。
dateyesterday允许一天前在日志文件名中使用日期。
要保持日常旋转文件(如7)的给定天数,您必须将rotate
设置为7,如果您的文件每天都创建并旋转,则可能忽略maxage
。
如果日志创建在两天内没有发生,那么在14天内,日志文件的轮转数量将保持不变(7)。
maxage
将通过总是删除过时的文件来改善“未生成日志”场景中的情况。 没有日志生成7天后,将不会出现轮转的日志文件。
您不能使用dateformat
作为OP显示,因为它不是词法排序。 搞砸dateformat
可能会导致删除其他旋转的日志文件比你真正想要的。
提示 :使用-d
选项从命令行运行logrotate以执行干运行:您将看到logrotate将执行的操作,但实际上并没有执行任何操作。 然后使用-v
(详细)执行手动运行,以便您可以确认所做的是您想要的。
这个概念是:
让cron来创建和更新日志文件,但做一些小修改来创建文件,跟随logrotate标准文件名使用默认dateext
/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
,以覆盖日志文件的数量保持(至少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
会导致轮换一天一次(根据cron
如何理解daily
) rotate
必须设置为7(或更高的数字)。 maxage
设置为7(天) dateext
使用默认的dateext
后缀日期后缀 dateyesterday
用于导致旋转文件中的日期后缀返回一天。 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;
(更新)您的选择是:
最初,我认为改变dateformat来匹配你的日志可能会起作用,但是Reid Nabinger指出日期格式与logrotate不兼容。 最近,我试图配置相同的东西,但对于我想要logrotate删除Java旋转日志。 我尝试了下面的配置,但它一直试图删除所有的日志
/opt/jboss/log/server.log.* { missingok rotate 0 daily maxage 30 }
我最终只是实现了Satish的建议 – 在cron中使用rm脚本进行简单的查找。
(无法评论为不够的声誉)
我有一个类似的问题。 通过所有帐户logrotate是没有用的内置日期戳的文件名。
如果所有其他的都是平等的,我可能会去find
一个cron工作。
出于我自己的原因,我想使用logrotate并最终找到了一种方法: https : //stackoverflow.com/a/23108631
从本质上讲,它是一种将cron作业封装在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 (ie, first the year, then the month then the day. eg, 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.
解决方法是更改为year-month-date,或者调用外部进程来执行清理。
根据@Jan Vlcinsky,你可以让logrotate添加日期 – 只需使用dateyesterday
即可获得正确的日期。
或者,如果你想自己输入日期,你可以“瞄准”没有日期的名字,然后清除日期的名字。
但是,我发现如果我没有日志文件,logrotate不会使用日期清理文件。
但是,如果你准备有一个空的日志文件,那么它可以工作。
例如,清理/ var / log / mylogfile。 yyyymmdd .log 7天后, touch /var/log/mylogfile.log
,然后配置logrotate,如下所示:
/var/log/mylogfile.log { 日常 旋转7 maxage 7 dateext dateformat。%Y%m%d 扩展名.log ifempty 创建 }
这个入口,加上mylogfile.log的存在,会触发logrotate来清理旧文件,就好像它们是由logrotate创建的一样。
daily
, rotate
加上maxage
导致旧的日志文件在7天后被删除(或7个旧的日志文件,以先到者为准)。
dateext
, dateformat
加extension
会导致logrotate匹配我们的文件名。
ifempty
plus create
确保在那里继续存在一个空文件,否则日志ifempty
将停止。
另一个测试的提示,准备编辑/var/lib/logrotate.status重置“最后一次旋转”的日期或logrotate不会为你做任何事情。