首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Logrotate清理带日期戳的文件

Logrotate清理带日期戳的文件
EN

Stack Overflow用户
提问于 2013-02-14 00:55:05
回答 5查看 100.5K关注 0票数 31

我目前正在尝试找出一种方法来整理由Cron创建的Oracle恢复日志文件...

目前,我们的Oracle备用恢复进程由Cron使用以下命令每15分钟调用一次:

代码语言:javascript
代码运行次数:0
运行
复制
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

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

代码语言:javascript
代码运行次数:0
运行
复制
$ 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:

代码语言:javascript
代码运行次数:0
运行
复制
/data/tier2/scripts/logs/recover_standby_*.log {
    daily
    dateext
    dateformat %d%m%Y
    maxage 7
    missingok
}

为了得到想要的结果,我是否遗漏了什么?

我想我可以从Crontab日志文件中删除日期,然后让logrotate轮换该文件,但是日志文件中的日期不会反映日志生成的日期……也就是说,010313上的恢复将在日期为020313的文件中,这是由于在020313上执行logrotate并旋转文件...

还有其他想法吗?如果您有任何回复,请提前向您致谢。

问候

加文

EN

回答 5

Stack Overflow用户

发布于 2014-12-19 20:56:27

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

  • rotate是旋转文件的最大数量,你可能会发现。如果循环日志文件的数量较多,则按词法对其名称进行排序,并删除词法最小的文件。
  • maxage定义了删除循环日志文件的另一个标准。任何早于给定天数的循环日志文件都将被删除。请注意,日期是从文件的上次修改时间检测到的,而不是从文件中检测到的。name.
  • dateformat允许对轮换文件中的日期进行特定格式设置。手册页说明,sorting.
  • dateyesterday允许在一天前的日志文件名中使用日期,格式应导致词法正确。

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

如果几天内没有创建日志,a.g.在14天内,循环日志文件的数量将保持不变(7)。

maxage将通过总是删除太旧的文件来改善“日志未生成”的情况。在没有日志生产的7天后,将不存在轮换的日志文件。

正如OP所示,您不能使用dateformat,因为它不是词法可排序的。搞乱dateformat可能会导致删除其他轮换日志文件,而不是您真正想要的。

提示:使用-d选项从命令行运行logrotate来执行预演:您将看到logrotate会做什么,但实际上不会做任何事情。然后使用-v (verbose)执行手动运行,这样您就可以确认所做的就是您想要的。

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

其概念是:

让cron创建和更新日志文件,但在使用默认dateext时,根据标准文件名做一些小的修改来创建文件

代码语言:javascript
代码运行次数:0
运行
复制
/data/tier2/scripts/logs/recover_standby_SID.log-`date +\%Y\%m\%d`.log

使用logrotate仅用于删除太旧的日志文件

  • 瞄准不存在的日志文件/data/tier2/scripts/logs/recover_standby_SID.log
  • use missingok以允许日志清理发生
  • rotate设置得足够高,以涵盖要保留的日志文件数量(如果每天有一个“轮换”的日志文件,则至少有7个,但您可以安全地将其设置得非常高,如9999)
  • maxage设置为7。这将删除上次修改时间大于7的文件仅用于确保logrotate搜索看起来像是轮换的较旧文件。<代码>H246<代码>F247

Logrotate配置文件将如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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

  • working每天通过/data/tier2/scripts/logs/recover_standby_SID.log

  • daily直接轮换文件一次daily)

  • rotate将导致每天轮换一次(就number).

  • maxage对(days)

  • dateext的理解而言,必须将daily)

  • rotate设置为7(或将任何更高的number).

  • maxage设置为7(days)

  • dateext才能使用默认的logrotate date suffix

  • dateyesterday,用于使已轮换文件中的日期后缀返回一天。

H174<即使没有要旋转的新内容,也可以使用/code>missingok清除旧文件。

Logrotate配置将如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
data/tier2/scripts/logs/recover_standby_SID.log {
    daily
    missingok
    rotate 7
    maxage 7
    dateext
    dateyesterday
}

请注意,您可能需要使用copytruncate和其他类似的选项,这些选项与外部进程如何创建源日志文件以及它如何对轮换行为做出反应有关。

票数 41
EN

Stack Overflow用户

发布于 2013-02-14 02:42:36

您可以使用find命令轻松完成该任务!它将删除所有7 Days旧文件。将其放在crontab中,然后每晚运行:

代码语言:javascript
代码运行次数:0
运行
复制
$ cd /data/tier2/scripts/logs/    
$ /usr/bin/find . -mtime +7 -name "*.log" -print -delete

或者更好的方式

代码语言:javascript
代码运行次数:0
运行
复制
$ /usr/bin/find /data/tier2/scripts/logs/ -mtime +7 -name "*.log" -print -delete;
票数 29
EN

Stack Overflow用户

发布于 2013-10-05 01:05:34

(更新)您的选项包括:

  • 正如萨蒂什回答的那样,放弃logrotate并将查找脚本放入cron
  • 中您甚至可以使用logrotate并将查找脚本放入

后旋转命令中。

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

代码语言:javascript
代码运行次数:0
运行
复制
/opt/jboss/log/server.log.* {
    missingok
    rotate 0
    daily
    maxage 30
}

我最终只是实现了萨蒂什的建议--在cron中用rm脚本实现一个简单的find。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14858752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档