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
Последние статьи :
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  Python 10.06   
 
TOP 20
 Part 3...266 
 Part 4...263 
 Kamran Husain...173 
 Commands...171 
 Secure Programming for Li...166 
 2.0-> Linux IP Networking...139 
 Сетунь...113 
 Stein-MacEachern-> Час...112 
 Ethreal 1...112 
 Python...108 
 Httpd-> История Ap...108 
 C++ Patterns 2...108 
 Trees...108 
 Steve Pate 2...108 
 Part 2...107 
 VPN...107 
 Intel 386...106 
 Plusquellic 1...106 
 Steve Pate 3...106 
 William Gropp...105 
 
  01.10.2020 : 2983014+ посещений 

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

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

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