Инструмент для помещения файла журнала HTTP в базу данных (с определенной схемой)?
Итак, я хочу поместить год назад или около того файлы Tomcat Combined Format в базу данных. Есть миллионы и миллионы хитов.
(План состоит в том, чтобы выполнять индивидуальные и специальные запросы к ним и сопоставлять их с некоторыми другими данными. У нас есть некоторые вопросы, на которые существующие продукты анализа журналов не могут ответить за нас.)
То, что я ищу, это...
- надежный инструмент для чистого импорта моего файла в базу данных
- существующая (типизированная, продуманная, без ошибок) схема для хранения и структурирования
Я на полшага от проката своего собственного, но это похоже на то, что делалось раньше - миллионы раз.
3 ответа
Посмотрите на asql. Это Perl-скрипт, который импортирует ваши apache-файлы в базу данных sqlite.
Это должно начать вас в правильном направлении:
Запись логов Apache в MySQL http://onlamp.com/pub/a/apache/2005/02/10/database_logs.html
Довольно легко адаптироваться к другой базе данных или настроить схему. На самом деле в схеме нет ничего особенного - простая таблица подойдет для соответствующих полей и индексов для эффективного поиска.
Я бы просто написал сценарий..
Возможно, это было написано бесчисленное количество раз раньше, но я сомневаюсь, что это будет для правильной базы данных или для вашей конкретной конфигурации журнала (Не уверен насчет расширенного формата журнала W3C, но со многими другими вы можете определить пользовательское форматирование)
Глядя на документ в формате журнала, было бы довольно просто взять каждое поле и создать для него столбец в БД.
Затем, чтобы проанализировать пример журнала из документа формата журнала:
#Version: 1.0
#Date: 12-Jan-1996 00:00:00
#Fields: time cs-method cs-uri
00:34:23 GET /foo/bar.html
12:21:16 GET /foo/bar.html
12:45:52 GET /foo/bar.html
12:57:34 GET /foo/bar.html
... следующий скрипт будет работать нормально, написание которого заняло всего несколько минут:
import re
import sys
mr = re.compile("^(\d\d:\d\d:\d\d) ([A-Z]+) (.+)$")
def insert_into_database(time, rtype, uri):
print "INSERT INTO database (%s, %s, %s)" % (time, rtype, uri)
for line in open("logfile.log").readlines():
m = mr.match(line)
if not m:
sys.stderr.write("Invalid line: %s\n" % line.strip())
else:
insert_into_database(m.group(1), m.group(2), m.group(3))
Может быть, не самый надежный / надёжный скрипт, но он работает (ну, кроме функции insert_into_database!)