整理由 vlogger 管理的旧 Apache 日志

整理由 vlogger 管理的旧 Apache 日志

我们正在使用 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)

相关内容