Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

Анализ логов Апача

Когда пользователь делает запрос , Apache HTTP Server записывает следующую информацию в файл "access_log":
  • IP-шник пользователя
  • имя запрашиваемой страницы
  • время запроса
  • web-адрес страницы , с которой сделан запрос
Рассмотрим код , в котором реализованы следующие методы :
  • __init__(file) - конструктор
  • subscribe(handler) - инициализация handler на controller.
  • run() - обработка файла
  • print_results() - распечатка результатов
 class controller:
 
     def __init__(self, f):
         self.m_file = f
         self.m_handlers = []
 
 
     def subscribe(self, o):
         self.m_handlers.append(o)
 
     def run(self):
 
         for o in self.m_handlers:
             o.begin()
 
         s = self.m_file.readline()
 
         while s != "":
 
             for o in self.m_handlers:
                 o.process_line(s)
 
             s = self.m_file.readline()
 
 
         for o in self.m_handlers:
             o.end()
 
 
     def print_results(self):
 
         print
         print "Results:"
         print
 
 for o in self.m_handlers:
         print "------------------------------------------------------"
         print o.description()
         print "------------------------------------------------------"
         print o.result()
handler - это класс , который реализует набор методов . Можно создать несколько хэндлеров одновременно . Каждый хэндлер должен реализовывать следующие методы :
  • begin() - вызывается однажды
  • process_line(line) - вызывается для каждой строки файла
  • end() - вызывается однажды в конце
  • description() controller.print_results().
  • result() controller.print_results().
Пример с хэндлером (здесь awk.py - это предыдущий листинг) :
 import sys
 
 # Custom awk.py module
 import awk
 
 class count_lines:
 
 	def begin(self):
 		self.m_count = 0
 
 	def process_line(self, s):
 		self.m_count += 1
 
 	def end(self):
 		pass
 
 	def description(self):
 		return "# of lines in the file"
 
 	def result(self):
 		return self.m_count
 
 # Step 1: Create the Awk controller
 ac = awk.controller(sys.stdin)
 
 # Step 2: Subscribe the handler
 ac.subscribe(count_lines())
 
 # Step 3: Run
 ac.run()
 
 # Step 4: Print the results
 ac.print_results()
Этот скрипт можно запустить так :
 	prompt$ cat access_log | python count_lines.py
Результат работы будет распечатан в консоли .

Подсчет посетителей

Следующий листинг - handlers.py - показывает реализацию :
 class return_visitors:
 
 	def __init__(self, n):
 		self.m_n = n
 		self.m_ip_days = {}
 
 	def begin(self):
 	    pass
 
 	def process_line(self, s):
 
 		try:
                 array = s.split()
                 ip = array[0]
                 day = array[3][1:7]
 
                 if self.m_ip_days.has_key(ip):
 
                         if day not in self.m_ip_days[ip]:
                                 self.m_ip_days[ip].append(day)
 
                 else:
                         self.m_ip_days[ip] = []
                         self.m_ip_days[ip].append(day)
 
         except IndexError:
                 pass
 
 
 
 def end(self):
 
         ips = self.m_ip_days.keys()
         count = 0
 
         for ip in ips:
 
                 if len(self.m_ip_days[ip]) > self.m_n:
                         count += 1
 
         self.m_count = count
 
 
 def description(self):
         return "# of IP addresses that visited more than %s days" % self.m_n
 
 def result(self):
 		return self.m_count
Скрипт подсчитывает число дней для каждого посещаемого ip-шника .

Ссылающиеся страницы

По этой информации можно узнать , откуда люди узнают о вашем сайте handlers.py :
 class referring_domains:
 
 	def __init__(self):
 		self.m_domains = {}
 
 	def begin(self):
 		pass
 
 	def process_line(self, line):
 
 		try:
                 array = line.split()
                 referrer = array[10]
 
                 m = re.search('//[a-zA-Z0-9\-\.]*\.[a-zA-z]{2,3}/',
                                 referrer)
 
                 length = len(m.group(0))
                 domain = m.group(0)[2:length-1]
 
                 if self.m_domains.has_key(domain):
                         self.m_domains[domain] += 1
                 else:
                         self.m_domains[domain] = 1
 
 		except AttributeError:
 			pass
 		except IndexError:
 			pass
 
 
 	def end(self):
 		pass
 
 
 	def description(self):
 		return "Referring domains"
 
 
 def sort(self, key1, key2):
         if self.m_domains[key1] > self.m_domains[key2]:
                 return -1
         elif self.m_domains[key1] == self.m_domains[key2]:
                 return 0
         else:
                 return 1
 
 
 def result(self):
 
         s = ""
         keys = self.m_domains.keys()
         keys.sort(self.sort)
 
         for domain in keys:
                 s += domain
                 s += " "
                 s += str(self.m_domains[domain])
                 s += "\n"
 
 		s += "\n\n"
 
 		return s
Скрипт генерирует список доменов , отсортированных по частоте .
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье