Logrotate清理日期标记的文件

fat*_*gav 24 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
Run Code Online (Sandbox Code Playgroud)

这会创建如下所示的文件:

$ 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
Run Code Online (Sandbox Code Playgroud)

我基本上想要删除早于x天的文件,我认为logrotate非常适合...

我已使用以下配置文件配置logrotate:

/data/tier2/scripts/logs/recover_standby_*.log {
    daily
    dateext
    dateformat %d%m%Y
    maxage 7
    missingok
}
Run Code Online (Sandbox Code Playgroud)

是否有一些我缺少的东西可以获得理想的结果?

我想我可以从Crontab日志文件中删除日期,然后logrotate旋转该文件,但是日志文件中的日期不会反映日志生成的日期...即010313上的恢复将存在于文件中由于020313上的logrotate触发并旋转文件而导致020313的日期...

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

问候

加文

Jan*_*sky 31

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

  • 你可能会发现,旋转是最大旋转文件数.如果旋转的日志文件数量较多,则会对其名称进行词法分类,并删除词法最小的日志文件.

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

  • dateformat允许旋转文件中日期的特定格式.手册页注释,格式应导致词法正确排序.

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

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

如果日志创建几天没有发生,ag为14天,则轮换日志文件的数量仍然相同(7).

maxage将通过始终删除太旧的文件来改善"未生成日志"方案中的情况.在没有日志生成的7天之后,将不存在旋转的日志文件.

您不能dateformat用作OP节目,因为它不是词法可排序的.搞乱dateformat可能会导致删除其他旋转的日志文件,而不是您真正想要的.

提示:从命令行运行logrotate并带有-d执行空运行的选项:您将看到logrotate将执行什么操作但实际上并没有执行任何操作.然后使用-v(详细)执行手动运行,以便您可以确认所执行的操作是您想要的.

解决方案:清理cron创建的日志

这个概念是:

让cron创建和更新日志文件,但在使用默认值时,在logrotate标准文件名之后进行小的修改以创建文件 dateext

/data/tier2/scripts/logs/recover_standby_SID.log-`date +\%Y\%m\%d`.log
Run Code Online (Sandbox Code Playgroud)

仅使用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
}
Run Code Online (Sandbox Code Playgroud)

解决方案:每天通过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
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可能需要使用copytruncate与其他类似选项相关的选项,这些选项与外部进程创建的源日志文件的方式以及它对循环操作的反应方式有关.

  • 这是迄今为止最好的答案.谢谢你 (3认同)

Sat*_*ish 18

您可以使用find命令轻松完成该任务!它将删除所有7 Days旧文件.把它crontab放进夜间运行:

$ cd /data/tier2/scripts/logs/    
$ /usr/bin/find . -mtime +7 -name "*.log" -print -delete
Run Code Online (Sandbox Code Playgroud)

或者更好的方式

$ /usr/bin/find /data/tier2/scripts/logs/ -mtime +7 -name "*.log" -print -delete;
Run Code Online (Sandbox Code Playgroud)

  • 不要用rm!错误一旦我没有写正确的文件夹和BOOM所有系统都被清空!使用logrotate是更好的选择 (11认同)
  • `find ... -exec/bin/rm {} \;`===`find ... -delete`.更容易阅读,更快(rm是每个文件的fork/exec)并且更少陷入困境. (4认同)

Lar*_*din 6

(已更新)您的选择是:

  • 正如 Satish 回答的那样,放弃 logrotate 并在 cron 中放置一个查找脚本
  • 您甚至可以使用 logrotate 并将 find 脚本放入 postrotate 命令中

最初,我认为更改日期格式以匹配您的日志可能会起作用,但正如 Reid Nabinger 指出的那样,日期格式无论如何与 logrotate 不兼容。最近,我尝试配置相同的东西,但对于我想要 logrotate 删除的 Java 旋转日志。我尝试了下面的配置,但它一直试图删除所有日志

/opt/jboss/log/server.log.* {
    missingok
    rotate 0
    daily
    maxage 30
}
Run Code Online (Sandbox Code Playgroud)

我最终只是实现了 Satish 的建议——在 cron 中使用 rm 脚本进行简单的查找。