2013-08-02 2 views
2

мне нужна логика, которая будет извлекать URL-адрес из файла журнала Apache: прямо сейчас я это сделал:Есть ли способ сделать эту функцию более приятной?

apache_log = {'@source': 'file://xxxxxxxxxxxxxxx//var/log/apache2/access.log', '@source_host': 'xxxxxxxxxxxxxxxxxxx', '@message': 'xxxxxxxxxxxxxxx xxxxxxxxxx - - [02/Aug/2013:12:38:37 +0000] "POST /user/12345/product/2 HTTP/1.1" 404 513 "-" "PycURL/7.26.0"', '@tags': [], '@fields': {}, '@timestamp': '2013-08-02T12:38:38.181000Z', '@source_path': '//var/log/apache2/access.log', '@type': 'Apache-access'} 
data = apache_log['@message'].split() 
if data.index('"POST') and data[data.index('"POST')+2].startswith('HTTP'): 
    print data[data.index('"POST')+1] 

Это возвращает меня:

/user/12345/product/2 

В принципе правильный результат, но путь Я сделал это, мне это не очень нравится.

Может кто-нибудь предложить лучший (более Pythonic) способ извлечения этого пути из файла журнала Apache.

+2

Принадлежит на codereview.SE. – geoffspear

+0

use phython regexp –

+1

Я не думаю, что часть 'if data.index ('" POST') 'работает так, как вы хотите. Для справки в будущем, проверяя, есть ли что-то в списке, это просто' '" POST 'в данных '. – user2357112

ответ

5

Регулярное выражение будет работать лучше:

import re 

post_path = re.compile(r'"POST (/\S+) HTTP') 

match = post_path.search(apache_log['@message']) 
if match: 
    print match.group(1) 

Демо:

>>> import re 
>>> apache_log = {'@source': 'file://xxxxxxxxxxxxxxx//var/log/apache2/access.log', '@source_host': 'xxxxxxxxxxxxxxxxxxx', '@message': 'xxxxxxxxxxxxxxx xxxxxxxxxx - - [02/Aug/2013:12:38:37 +0000] "POST /user/12345/product/2 HTTP/1.1" 404 513 "-" "PycURL/7.26.0"', '@tags': [], '@fields': {}, '@timestamp': '2013-08-02T12:38:38.181000Z', '@source_path': '//var/log/apache2/access.log', '@type': 'Apache-access'} 
>>> post_path = re.compile(r'"POST (/\S+) HTTP') 
>>> match = post_path.search(apache_log['@message']) 
>>> if match: 
...  print match.group(1) 
... 
/user/12345/product/2 
+1

Спасибо @Martijn, что ваши ответы всегда замечательные! – Vor

Смежные вопросы