Форум сайта python.su
0
Добрый день.
Прошу помощи в таком вопросе.
Хочу распарсить лог 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
Офлайн
6
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/
Офлайн
> Требуется помощь такого характера: подскажите, пожалуйста, с помощью чего лучше это реализовать?
Вам нужен модуль re: http://docs.python.org/2/library/re.html
Для записи в БД можете использовать модули mysql-python (MySQL) или psycopg2 (Postgres)
> Насколько это будет тормозить?
Зависит от настроек вашей БД, если логов много, может тормозить вставка записей в БД. Если не нужна какая-то универсальность сильная, можно проводить импорт в два этапа.
Парсинг логов и подготовка CSV-файла. И следующим этапом импорт CSV средставами БД (LOAD DATA INFILE в MySQL, или COPY в Postgres)
Офлайн
0
К сожалению так и не понял как использовать “python-logsparser”, но установил.
Вы уж простите, но совсем новичок, в том числе и в программировании вообще. Если есть, то дайте, пожалуйста, ссылки.
Я пытаюсь делать приблизительно так.
str = fopen('access.log')
line = str.readline()
while line:
тут каким то образом обработать строку. видимо с помощью регулярок.
и записать в базу. на данный момент хочу распарсить строку, а потом уже записывать в базу пытаться.
или может быть разбить строку и сделать из нее список, элементы ведь на своих местах каждый раз?
Офлайн
22
я вот так парсил
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()
Офлайн
0
так проще же можно…правда переделай для себя
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)
Офлайн
0
На данный момент, не очень понятно как записать распарсенные строки в базу.
Выше предлагался вариант с CSV файлом. С ним около миллиона строк пишется довольно быстро.
Возможен ли вариант с транзакцией, не используя какие либо дополнительные файлы?
Офлайн
22
а в чем проблема? Парсиш лог и пишешь не в файл, а сразу в БД
Офлайн
0
Если не сложно, напишите, пожалуйста, пример. Проблема в том, что никак не разберусь с DBI и транзакциями, через эту обертку.
Офлайн