Назад | Перейти на главную страницу

Отслеживание использования полосы пропускания IMAP пользователями dovecot

Один из моих клиентов использует огромную пропускную способность, похоже, это связано с 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])