我们正在使用 vlogger 来管理我们的 apache 日志,这使一切都保持整洁,但据我所知,这几乎破坏了使用 logrotate 的能力。例如,我们的虚拟 access.logs 各自位于自己的目录中,并且命名类似于:
/virtual.com/ 20100501-访问.log 20100502-访问.log 20100503-访问.log 20100504-访问.log
ETC..
有人创建过清理脚本来遍历 /var/log/httpd/ 子目录并删除旧日志吗?我们喜欢使用 vlogger,但使用后清理旧日志却很麻烦!
答案1
如果您在 Unix/Linux 平台上运行,那么您可以使用“find”命令轻松完成此操作。 看这里一个很好的教程。如果需要,您可以对它们进行 gzip 压缩,然后根据上次修改时间 rm 原始日志。
答案2
我实际上不建议使用修改后的时间,因为某些事情可能会搞乱它,然后你会丢失日志。
我可能会使用的一个很好的解决方案是解析每个文件的日期,将它们转换为 python 或 perl 中的 datetime 对象,然后删除早于 X 的日志。
一个更一次性的解决方案可能是类似下面的在 shell 中删除上个月的日志(当然没有回显):
echo rm */20100$(($(date +%m) - 1 ))*-access.log
$(( ))
是bash算术,$( )
是命令替换,你可以看到,它们是可以嵌套的。
答案3
我目前正在使用以下 Python 脚本。我真的不记得为什么我要使用默认日期掩码,这确实很尴尬。调整 MASK 中定义的 RE,更改 LOGDIR 变量并将 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)