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
 Alg3...2409 
 Intel 386...784 
 Secure Programming for Li...722 
 Trees...679 
 Lists...621 
 Си за 21 день...598 
 2.0-> Linux IP Networking...596 
 Ethreal 1...583 
 Stein-MacEachern-> Час...580 
 Стивенс 1...570 
 Steve Pate 3...547 
 Ethreal 2...541 
 Rodriguez 6...506 
 Python...505 
 Стивенс 4...494 
 William Gropp...471 
 Advanced Bash Scripting G...462 
 Стивенс 5...432 
 Keogh 2...421 
 Cluster 4...416 
 
  01.08.2020 : 2947670+ посещений 

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

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

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