Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Advanced Bash Scripting G...1965 
 Ethreal 4...1411 
 Secure Programming for Li...1180 
 CPAN-> FAQ...1095 
 Intel 386...755 
 Go Web ...703 
 Тренажёр...674 
 Trees...621 
 Ethreal 1...602 
 Alg1...585 
 Rust...561 
 Максвелл 3...549 
 Assembler...543 
 C + UNIX...536 
 Ext4 FS...506 
 Mod_parrot...484 
 William Gropp...483 
 Go...468 
 System...455 
 Benchmark...454 
 
  01.01.2025 : 3803065 посещений 

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
Скрипт генерирует список доменов , отсортированных по частоте .
Оставьте свой комментарий !

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

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