Logrotate清理日期标记的文件

时间:2013-02-13 16:55:05

标签: linux oracle logrotate

我目前正在尝试找出一种方法来整理由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的文件

还有其他想法吗? 并提前感谢您的任何回复。

此致

加文

6 个答案:

答案 0 :(得分:29)

Logrotate根据旋转日志文件名的词法排序列表中的顺序删除文件,也按文件年龄(使用文件的上次修改时间)删除文件

    您可以找到
  • 旋转是旋转文件的最大数量。如果旋转的日志文件数量较多,则会对其名称进行词法分类,并删除词法最小的日志文件。

  • maxage 定义了删除轮换日志文件的另一个标准。将删除任何超过给定天数的旋转日志文件。请注意,日期是从文件的上次修改时间检测到的,而不是从文件名中检测到的。

  • dateformat 允许对旋转文件中的日期进行特定格式设置。手册页注释,格式将导致词法正确排序

  • dateyesterday 允许在一天后使用日志文件名中的日期。

要保持每日轮播文件中的给定天数(例如7),您必须将rotate设置为值7,如果您的文件每天都创建和旋转,您可以忽略maxage

如果日志创建没有发生几天,例如14天,旋转的日志文件数仍然相同(7)。

maxage将改善"未生成的日志"始终删除太旧的文件的方案。在没有日志生成的7天之后,将不会出现旋转的日志文件。

您不能使用dateformat作为OP显示,因为它不是词法可排序的。与dateformat混淆可能会导致删除其他旋转的日志文件,而不是您真正想要的。

提示:使用-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足够高,以涵盖要保留的日志文件数量(至少7个,如果有一个"旋转"日志文件,但你可以安全地设置它高如9999)
  • maxage设置为7.这将删除上次修改时间超过7天的文件。
  • dateext仅用于确保,搜索看起来像旋转的旧文件。

Logrotate配置文件如下所示:

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

解决方案:每天通过logrotate直接旋转

我不确定,源恢复备用文件是如何创建的,但我会假设,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)

(更新) 您的选择是:

  • 当Satish回答时,放弃logrotate并在cron中放置一个find脚本
  • 你甚至可以使用logrotate并在postrotate命令中添加一个find脚本

最初,我认为更改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创建的一样。

dailyrotatemaxage会导致旧日志文件在7天后被删除(或7个旧日志文件,以先到者为准)。

dateextdateformatextension会导致logrotate与我们的文件名匹配。

并且ifemptycreate确保那里继续存在空文件,否则日志轮换将停止。

另一个测试提示,准备编辑/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.

解决方案是更改为年 - 月 - 日期,或调用外部流程执行清理。