我目前正在尝试找出一种方法来整理由Cron创建的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
这会创建如下所示的文件:
$ 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的文件还有其他想法吗? 并提前感谢您的任何回复。
此致
加文
答案 0 :(得分:29)
Logrotate根据旋转日志文件名的词法排序列表中的顺序删除文件,也按文件年龄(使用文件的上次修改时间)删除文件
旋转是旋转文件的最大数量。如果旋转的日志文件数量较多,则会对其名称进行词法分类,并删除词法最小的日志文件。
maxage 定义了删除轮换日志文件的另一个标准。将删除任何超过给定天数的旋转日志文件。请注意,日期是从文件的上次修改时间检测到的,而不是从文件名中检测到的。
dateformat 允许对旋转文件中的日期进行特定格式设置。手册页注释,格式将导致词法正确排序。
dateyesterday 允许在一天后使用日志文件名中的日期。
要保持每日轮播文件中的给定天数(例如7),您必须将rotate
设置为值7,如果您的文件每天都创建和旋转,您可以忽略maxage
如果日志创建没有发生几天,例如14天,旋转的日志文件数仍然相同(7)。
maxage
将改善"未生成的日志"始终删除太旧的文件的方案。在没有日志生成的7天之后,将不会出现旋转的日志文件。
您不能使用dateformat
作为OP显示,因为它不是词法可排序的。与dateformat
混淆可能会导致删除其他旋转的日志文件,而不是您真正想要的。
提示:使用-d
选项从命令行运行logrotate以执行空运行:您将看到logrotate将执行哪些操作但实际上并未执行任何操作。然后使用-v
(详细)执行手动运行,以便您可以确认所执行的操作是您想要的。
概念是:
让cron创建和更新日志文件,但在使用默认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配置文件如下所示:
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
使用默认的logrotate日期后缀dateyesterday
用于在旋转的文件中导致日期后缀为一天。missingok
即使没有要旋转的新内容,也要清除旧文件。Logrotate配置看起来像:
data/tier2/scripts/logs/recover_standby_SID.log {
daily
missingok
rotate 7
maxage 7
dateext
dateyesterday
}
请注意,您可能需要使用copytruncate
和其他类似选项,这些选项与外部进程创建的源日志文件的方式以及它对旋转行为的反应有关。
答案 1 :(得分:16)
您可以使用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;
答案 2 :(得分:4)
(更新) 您的选择是:
最初,我认为更改dateformat以匹配您的日志可能会有效,但正如Reid Nabinger所指出的那样,日期格式与logrotate不兼容。最近,我尝试配置相同的东西,但对于Java旋转日志,我希望logrotate删除。我尝试了下面的配置,但它一直试图删除所有日志
/opt/jboss/log/server.log.* {
missingok
rotate 0
daily
maxage 30
}
我最终只是实现了Satish建议的内容 - 在cron中使用rm脚本进行简单的查找。
答案 3 :(得分:3)
(无法评论为没有足够的声誉)
我有类似的问题。根据所有帐户,logrotate对于内置日期戳的文件名无用。
如果所有其他条件都相同,我可能会在cron作业中使用find
。
出于我自己的原因,我想使用logrotate并最终找到一种方法:https://stackoverflow.com/a/23108631
本质上,它是一种将cron作业封装在logrotate文件中的方法。也许不是最漂亮或最有效的,但就像我说的,我有我的理由。
答案 4 :(得分:2)
根据@Jan Vlcinsky,您可以让logrotate添加日期 - 只需使用dateyesterday
即可获得正确的日期。
或者,如果你想自己输入日期,你可以“瞄准”没有日期的名字,然后清理带有日期的名字。
但是,我发现如果我没有日志文件,logrotate不会清除带有日期的文件。
但是如果你准备好一个空的日志文件,那么就可以使它工作。
例如,要在7天touch /var/log/mylogfile.log
之后清理/var/log/mylogfile.yyyymmdd.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将不会为你做任何事情。
答案 5 :(得分:1)
仅供参考我知道这是一个老问题,但它不适合你的原因是因为你的日期格式不是词法可排序的。从联机帮助页:
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.
解决方案是更改为年 - 月 - 日期,或调用外部流程执行清理。