整理由vloggerpipe理的旧apache日志

我们正在使用vlogger来pipe理我们的apache日志,它保持了一切的美好和整洁,但几乎打破了从我看到的使用logrotate的能力。 例如。 我们的虚拟access.log每个都在他们自己的目录中,并被命名为类似于:

/virtual.com/ 20100501-access.log 20100502-access.log 20100503-access.log 20100504-access.log

等等..

有没有人创build一个清理脚本来通过/ var / log / httpd /子目录和删除旧日志? 我们喜欢使用vlogger,但是这是一个痛苦之后清理旧的日志。

如果您在Unix / Linux平台上运行,那么您可以使用“find”命令轻松完成此操作。 在这里看到一个很好的教程。 如果需要,可以将它们gzip,然后根据上次修改时间rm原始日志。

我其实不会推荐使用修改过的时间,因为有些东西可能会搞砸了,然后就会丢失日志。

我可能使用的一个很好的健壮解决scheme是parsing每个文件的date,将它们转换为python或perl中的datetime对象,然后删除比X日志更早的date。

更多的一个解决scheme可能是类似于下面的东西从上个月删除日志(当然没有回声):

echo rm */20100$(($(date +%m) - 1 ))*-access.log 

$(( ))是bash算术, $( )是命令replace,你可以看到它们可以嵌套。

我目前正在使用下面的python脚本。 我真的不记得为什么我使用默认date掩码,这是肯定尴尬。 调整MASK中定义的RE,更改LOGDIR var并将THRESHOLD设置为要保留的天数。

 #!/usr/bin/env python # THIS SCRIPT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, # EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR # PURPOSE, OR NON-INFRINGEMENT. import datetime import os import re LOGDIR = '/srv/logs' MASK = re.compile('(?P<month>\d{2})(?P<day>\d{2})(?P<year>\d{4})\-') THRESHOLD = 10 topdirs = [d for d in os.listdir(LOGDIR) if os.path.isdir(os.path.join(LOGDIR, d)) and d[0] != '.'] removed = 0 errors = [] for d in topdirs: vhost = os.path.join(LOGDIR, d) for f in os.listdir(vhost): logfile = os.path.join(vhost, f) if os.path.isfile(logfile): m = re.match(MASK, f) if m: dt = datetime.date(int(m.group('year')), int(m.group('month')), int(m.group('day'))) delta = datetime.date.today() - dt if delta.days > THRESHOLD: try: os.unlink(logfile) except OSError: errors.append(logfile) else: removed += 1 print 'Pruned %d logfiles' % removed if errors: print 'Errors:' print '\n'.join(errors)