Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
 Алгоритмы
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
 MINIX...3057 
 Solaris...2933 
 LD...2904 
 Linux Kernel 2.6...2470 
 William Gropp...2180 
 Rodriguez 6...2012 
 C++ Templates 3...1945 
 Trees...1937 
 Kamran Husain...1866 
 Secure Programming for Li...1792 
 Максвелл 5...1710 
 DevFS...1694 
 Part 3...1684 
 Stein-MacEachern-> Час...1632 
 Go Web ...1624 
 Ethreal 4...1618 
 Arrays...1607 
 Стивенс 9...1603 
 Максвелл 1...1592 
 FAQ...1538 
 
  01.01.2024 : 3621733 посещений 

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

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

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