Mengurai file log apache

Saya baru saja mulai belajar Python dan ingin membaca file log Apache dan menempatkan bagian-bagian dari setiap baris ke dalam daftar yang berbeda.

baris dari file tersebut

172.16.0.3 - - [25/Sep/2002:14:04:19 +0200] "GET / HTTP/1.1" 401 - "" "Mozilla/5.0 (X11;U;Linux i686;en-US;rv:1.1) Gecko/20020827"

menurut situs web Apache formatnya adalah

%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\

Saya dapat membuka file dan membacanya apa adanya, tetapi saya tidak tahu cara membuatnya terbaca dalam format tersebut sehingga saya dapat memasukkan setiap bagian ke dalam daftar.

Larutan

Ini adalah pekerjaan untuk ekspresi reguler.

Sebagai contoh:

line = '172.16.0.3 - - [25/Sep/2002:14:04:19 +0200] "GET / HTTP/1.1" 401 - "" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827"'
regex = '([(\d\.)]+) - - \[(.*?)\] "(.*?)" (\d+) - "(.*?)" "(.*?)"'

import re
print re.match(regex, line).groups()

Keluarannya adalah sebuah tuple dengan 6 buah informasi dari baris tersebut (khususnya, kelompok-kelompok di dalam tanda kurung pada pola tersebut):

('172.16.0.3', '25/Sep/2002:14:04:19 +0200', 'GET / HTTP/1.1', '401', '', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827')
Komentar (5)

Gunakan ekspresi reguler untuk membagi baris menjadi "token" yang terpisah:

>>> row = """172.16.0.3 - - [25/Sep/2002:14:04:19 +0200] "GET / HTTP/1.1" 401 - "" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827" """
>>> import re
>>> map(''.join, re.findall(r'\"(.*?)\"|\[(.*?)\]|(\S+)', row))
['172.16.0.3', '-', '-', '25/Sep/2002:14:04:19 +0200', 'GET / HTTP/1.1', '401', '-', '', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.1) Gecko/20020827']

Solusi lain adalah dengan menggunakan alat khusus, misalnya http://pypi.python.org/pypi/pylogsparser/0.4

Komentar (0)

Saya telah membuat sebuah pustaka python yang melakukan hal tersebut: apache-log-parser.

>>> import apache_log_parser
 >>> line_parser = apache_log_parser.make_parser("%h  %t %Dus \"%r\" %>s %b  \"%{Referer}i\" \"%{User-Agent}i\" %l %u")
>>> log_line_data = line_parser('127.0.0.1  [16/Aug/2013:15:45:34 +0000] 1966093us "GET / HTTP/1.1" 200 3478  "https://example.com/" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.18)" - -')
>>> pprint(log_line_data)
{'pid': '6113',
 'remote_host': '127.0.0.1',
 'remote_logname': '-',
 'remote_user': '',
 'request_first_line': 'GET / HTTP/1.1',
 'request_header_referer': 'https://example.com/',
 'request_header_user_agent': 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.18)',
 'response_bytes_clf': '3478',
 'status': '200',
 'time_received': '[16/Aug/2013:15:45:34 +0000]',
 'time_us': '1966093'}
Komentar (0)