Один из моих клиентов использует огромную пропускную способность, похоже, это связано с IMAP, а не с их фактическим веб-сайтом.
Существует файл журнала / var / log / maillog, который регистрирует каждое соединение IMAP и количество байтов, отправленных / прочитанных клиенту:
Я пытаюсь собрать небольшой сценарий оболочки, который будет подсчитывать пропускную способность каждого пользователя, чтобы мы могли выяснить, какая это учетная запись электронной почты.
Oct 1 10:43:00 web1 dovecot: IMAP(user1@userdomain.com): Disconnected: Logged out bytes=363/4407
Oct 1 10:43:00 web1 dovecot: IMAP(user1@userdomain.com): Disconnected: Logged out bytes=63/492
Oct 1 10:43:00 web1 dovecot: IMAP(user2@userdomain.com): Disconnected: Logged out bytes=386/15378
Oct 1 10:43:00 web1 dovecot: IMAP(user2@userdomain.com): Disconnected: Logged out bytes=63/509
Oct 1 10:43:20 web1 dovecot: IMAP(user3@userdomain.com): Disconnected: Logged out bytes=345/3044
Oct 1 10:43:20 web1 dovecot: IMAP(user3@userdomain.com): Disconnected: Logged out bytes=63/492
Oct 1 10:43:20 web1 dovecot: IMAP(user4@userdomain.com): Disconnected: Logged out bytes=784/40163
Oct 1 10:43:20 web1 dovecot: IMAP(user4@userdomain.com): Disconnected: Logged out bytes=63/622
Формат журнала:
# IMAP logout format string:
# %i - total number of bytes read from client
# %o - total number of bytes sent to client
#imap_logout_format = bytes=%i/%o
Поэтому нужно просто добавить оба последних поля и указать адрес электронной почты:
Я нашел следующий сценарий, но я не использую directadmin, но должен иметь возможность придумать что-то подобное, однако мне не удалось заставить его работать должным образом.
http://forum.directadmin.com/showthread.php?t=36588
У кого-нибудь есть идеи?
Заранее спасибо!
Этот сценарий может работать. Что ж, у меня сработало, используя приведенный вами пример вывода.
#!/usr/bin/python
import os
import sys
import re
logline = re.compile(".+?dovecot: IMAP\((.+?)\): Disconnected: Logged out bytes=(\d+)/(\d+)")
matched = 0
totallines = 0
results = {}
if __name__ == "__main__":
if len(sys.argv) < 2:
print "Need logfile to continue"
logfile = open(sys.argv[1])
for line in logfile.readlines():
totallines += 1
log = logline.match(line)
if log:
matched += 1
user, inb, outb = log.group(1), int(log.group(2)), int(log.group(3))
if user in results:
results[user][0] += inb
results[user][1] += outb
else:
results[user] = [inb, outb]
else:
continue
print "Matched {0} of {1} lines".format(matched, totallines)
for k in results.keys():
r = results[k]
print "{0}: {1}/{2} Total: {3}".format(k, r[0], r[1], r[0]+r[1])