Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 22, 2013 07:45:34

Dalandis
Зарегистрирован: 2013-08-22
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер лога

Добрый день.

Прошу помощи в таком вопросе.
Хочу распарсить лог nginx.

Хочу делать так. Читаем лог nginx и из каждой строки выбираем:

1. IP с которого пришел запрос (177.164.64.151)
2. Дату и время (21/Aug/2013:03:26:26)
3. Домен (domain.ru)
4. Тип запроса, пост или гет (GET)
5. Код ответа (200)

Далее все выбранное должно записаться в базу.

Требуется помощь такого характера: подскажите, пожалуйста, с помощью чего лучше это реализовать? Насколько это будет тормозить?
Полезные ссылки по теме очень приветствуются.

Пример строки лога:
177.164.64.151 - - domain.ru GET /layouts/anc/prodam-blanki-osago-2d.html HTTP/1.1 200 4133 “-” "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)“ ”-" 8.152-6.924

Офлайн

#2 Авг. 22, 2013 07:50:29

wbt
Зарегистрирован: 2013-08-13
Сообщения: 143
Репутация: +  6  -
Профиль   Отправить e-mail  

парсер лога

apt-cache show python-logsparser

Package: python-logsparser
Source: pylogsparser
Version: 0.4-1
Architecture: all
Depends: python2.7 | python2.6, python (>= 2.6.6-7~), python (<< 2.8), python-lxml, python-tz, python-geoip
Description-en: Python library for log parsing, tagging and analysis.
Pylogsparser is a library that can be used to parse log lines and extract
various metadata out of them according to known log formats. The library
is shipped with several default log formats, such as Syslog, Apache, sshd and
many others. It is also possible to define and use your own log formats with
the library, as XML definition files.
Homepage: http://www.wallix.org/pylogsparser-project/



Бейсик - не порок, Гвидо - не пророк

Офлайн

#3 Авг. 22, 2013 08:01:08

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

парсер лога

> Требуется помощь такого характера: подскажите, пожалуйста, с помощью чего лучше это реализовать?

Вам нужен модуль re: http://docs.python.org/2/library/re.html
Для записи в БД можете использовать модули mysql-python (MySQL) или psycopg2 (Postgres)

> Насколько это будет тормозить?

Зависит от настроек вашей БД, если логов много, может тормозить вставка записей в БД. Если не нужна какая-то универсальность сильная, можно проводить импорт в два этапа.
Парсинг логов и подготовка CSV-файла. И следующим этапом импорт CSV средставами БД (LOAD DATA INFILE в MySQL, или COPY в Postgres)

Офлайн

#4 Авг. 22, 2013 08:23:41

Dalandis
Зарегистрирован: 2013-08-22
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер лога

К сожалению так и не понял как использовать “python-logsparser”, но установил.
Вы уж простите, но совсем новичок, в том числе и в программировании вообще. Если есть, то дайте, пожалуйста, ссылки.


Я пытаюсь делать приблизительно так.

str = fopen('access.log')
line = str.readline()
while line:
тут каким то образом обработать строку. видимо с помощью регулярок.
и записать в базу. на данный момент хочу распарсить строку, а потом уже записывать в базу пытаться.
или может быть разбить строку и сделать из нее список, элементы ведь на своих местах каждый раз?


Офлайн

#5 Авг. 23, 2013 06:52:14

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

парсер лога

я вот так парсил

       log_ = os.path.join(settings.ROOT_PATH, '../logs', 'nginx_access.log')
        if os.path.exists(log_):
            with open(log_) as log:        
                for i in log:
                    stroka = re.findall(r'(\d+.\d+.\d+.\d+) (\w+|\-) (\w+|\-) \[(.+)\] '
                                     r'\"(.+)\" (\d+) (\d+) \"(.*)\" \"(.*)\"', i)[0]
                    # ip nd nd time path code size nd brouser
                    AccessVisiters(
                        ip=stroka[0],
                        nd1=stroka[1],
                        nd2=stroka[2],
                        date=datetime.datetime.strptime(stroka[3].split(' ')[0],
                                                        '%d/%b/%Y:%H:%M:%S'),
                        path=stroka[4],
                        code=int(stroka[5]),
                        size=int(stroka[6]),
                        nd3=stroka[7],
                        brouser=stroka[8]).save()

Офлайн

#6 Авг. 27, 2013 09:42:51

grice88
Зарегистрирован: 2013-01-08
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер лога

так проще же можно…правда переделай для себя

with open('/var/log/syslog', 'r') as logfile:
    for line in logfile.readlines():
        if 'USB' in line:
            print line

Отредактировано grice88 (Авг. 27, 2013 09:44:10)

Офлайн

#7 Окт. 4, 2013 15:35:57

Dalandis
Зарегистрирован: 2013-08-22
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер лога

На данный момент, не очень понятно как записать распарсенные строки в базу.

Выше предлагался вариант с CSV файлом. С ним около миллиона строк пишется довольно быстро.

Возможен ли вариант с транзакцией, не используя какие либо дополнительные файлы?

Офлайн

#8 Окт. 4, 2013 15:59:52

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

парсер лога

а в чем проблема? Парсиш лог и пишешь не в файл, а сразу в БД

Офлайн

#9 Окт. 4, 2013 16:39:17

Dalandis
Зарегистрирован: 2013-08-22
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер лога

Если не сложно, напишите, пожалуйста, пример. Проблема в том, что никак не разберусь с DBI и транзакциями, через эту обертку.

Офлайн

#10 Окт. 5, 2013 09:56:25

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

парсер лога

Что такое DBI?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version