LINUX.ORG.RU
ФорумTalks

Парсер логов с sql интерфейсом

 ,


0

1

Я тут подумал, наверняка ведь есть много таких же как я, которые плохо знают всякие sort, unique, awk, sed, зато отлично помнят все про sql.

И каждый раз, когда надо почитать логи, вспоминание стандартных подходов занимает драгоценное время. Почему бы не написать утилиту с sql интерфейсом?

% cat file | awk {'print $1 $3 $7'}
% cat file | sqllp 'select 1 date, 3 ip, 4 url'

% cat file | awk {'print $3'} | sort -u
% cat file | sqllp 'select distinct 1 ip'

% cat file | sqllp 'select 1 ip, count(*) n group by ip order by n desc limit 10'

% cat file | sqllp 'select * where 4 ilike '%assets%'

И т.д. и т.п. Есть подозрение что такое уже сделали, может кто знает как поискать?



Последнее исправление: gistart (всего исправлений: 1)

Посмотрите на http://lnav.org/

Какая-то реализация SQL у него там была точно.

Deleted
()

Я тут подумал, наверняка ведь есть много таких же как я, которые плохо знают всякие perl, sql, python, ruby, зато отлично помнят все про bash.

И каждый раз, когда надо почитать логи, вспоминание стандартных подходов занимает драгоценное время. Почему бы не написать утилиту с bash... wait...

Pyzia ★★★★★
()
Ответ на: комментарий от Pyzia

давай по честному без мана и по памяти — сделай вот так

% cat file | sqllp 'select 1 ip, count(*) n group by ip order by n desc limit 10'

gistart
() автор топика
Ответ на: комментарий от gistart

если ТОЛЬКО для одного типа логов то напишешь. И будешь переписывать каждый раз когда будут менять логи (а еще у тебя 100% не все сообщения сервера будут. Например пока ты писать будешь у тебя не будет сообщений о всяких падениях).

demrnd
()
Ответ на: комментарий от demrnd

Задача — добиться того же, что делают sort, uniq, awk и прочие классические утилиты, но чтоб шпарить по памяти, без подглядывания в маны.

gistart
() автор топика
Ответ на: комментарий от pawnhearts

ну по первых вывод не красивый, там же тысячи клиентов — нихрена не понятно

во вторых, что-то я забыл, надо еще where 2::date between today() and yesterday() and url like '%.js'

gistart
() автор топика
Ответ на: комментарий от leave

Это да, надо угадать как выглядит разделитель столбцов. Но ведь что sort что awk как-то справляются? Можно попробовать угадать, например что чаще встречается и т.п.

gistart
() автор топика
Ответ на: комментарий от gistart

Вывод можно какой угодно сделать.

дописываешь сюда

collections.Counter(x.split()[0] for x in sys.stdin.readlines() if ".js" in x.split()[1] and blabla)

pawnhearts ★★★★★
()
Ответ на: комментарий от demrnd

Cтруктурированный лог ничем не отличается от таблицы [timestamp][lim][ip][lim][httpmethod][lim][url][lim][time]

Надо только правильно определить lim.

gistart
() автор топика
Последнее исправление: gistart (всего исправлений: 1)
Ответ на: комментарий от gistart

По-моему тут просто вопрос выбора питонячьей библиотеки. Синтаксис там будет вполне читаемый и запоминаемый, возможностей больше чем в SQL.

af5 ★★★★★
()
Ответ на: комментарий от gistart

Ты покажи пример лога и что из него надо получить и любой нормальный админ по памяти без манов с помощью стандартных утилит выдаст нужное. Причём даже если лог не стандартизирован. Для этого все эти утилиты и придуманы - взглянул на лог, глазами проанализировал и тут же написал нужное выражение. А в твоём sql'ном запросе разбираться лень.

Собственно поэтому и не написали такой утилиты.

shell-script ★★★★★
()
Ответ на: комментарий от pawnhearts

а если select date_part(1::date, 'hour') d, 4 url, count(*) group by d, url?

gistart
() автор топика
Ответ на: комментарий от shell-script

Предлагаешь каждый раз звать админа?

А в твоём sql'ном запросе разбираться лень.

А вот мне наоборот: sql по памяти и без манов писать гораздо проще, чем на стандартных утилитах. Плюс sqlем можно просто выразить довольно сложные запросы.

gistart
() автор топика
Ответ на: комментарий от shell-script

и не написали такой утилиты.

Всякие анализаторы логов читают логи и пихают в базы. Только не sql обычно, а что-то nosql

pawnhearts ★★★★★
()

Напиши. В C# есть такая библиотечка - linq, можно select к любой коллекции применить

tiinn ★★★★★
()
Ответ на: комментарий от pawnhearts

в базу пихать не надо — надо получить файл и быстро вывести результат, как со стандартными утилитами

gistart
() автор топика
Ответ на: комментарий от gistart

Плюс sqlем можно просто выразить довольно сложные запросы.

Вырази мне sql-ем например запрос, выводящий все строчки таблицы где разница в каком-нибудь поле между предыдущей и текущей и текущей и следующей строкой меньше некоего значения, заданного в том же поле первой строки.

SQL далеко не так удобен, как хотелось бы.

Stanson ★★★★★
()
Ответ на: комментарий от gistart

journalctl же, не? У него ппц мощная система сортировки и выборки.

sparks ★★★
()
Ответ на: комментарий от gistart

Дело не только в разделителе, но и в том, что поля местами могут меняться как угодно, плюс (на примере nginx) в поле может быть не только значение, но и идентификатор (наименование) поля.

Как-то так

10.0.0.1 example.com [30/Mar/2018:09:47:45 +0000] r:0.013 up:0.013 "GET /svc/sessions/?id=6106897&active=1 HTTP/1.1" 200 84 "hackney/1.7.1" "-" 10.10.2.2:8001 "-" "."
обрати внимание на «r:0.013 up:0.013» - это response time и upstream response time.

leave ★★★★★
()
Ответ на: комментарий от gistart
% cat file | cut -f 1,3 -d ' ' | grep '*.js$' | uniq -c | sort -n -r | head -n 10

Про дату напишу если запостишь в job. :) Если хочешь сам, то man date, man bash. Там несложно, date умеет гораздо больше, чем просто текущую дату показывать. В том числе и '+1 day' и '-1 day'

А на самом деле, для таких вычурных штук удобнее awk или вообще perl

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

я понял, предлагаешь писать сложную программу, вместо описания результата на sql. именно с этим и хочется побороться)

gistart
() автор топика
Ответ на: комментарий от leave

ну и отлично же — формат полей пользователь пусть разбирает сам: select max(split_part(3, ':', 1)::float) max_resp, 5 url group by url

gistart
() автор топика
Последнее исправление: gistart (всего исправлений: 1)
Ответ на: комментарий от gistart

Что там сложного-то. awk проще SQL на порядок, перл просто лаконичный. даты парсить и считать +- дни часы недели умеет date.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от gistart

Ну сначала «напиши это», потом «ой, я забыл что нужно ещё и это», потом «а ещё вот это», а потом ты идёшь и получаешь за написанное зачёт или зарплату так и не научившись ничему. Я же уверен, что лучше научить человека ловить рыбу, нежели просто дать её ему.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

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

gistart
() автор топика
Ответ на: комментарий от gistart

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

Если возникают подобное непонимание, то в чём проблема с job? Там можно даже вожделённый sqllp приобресть. Или просто заплатить за готовое решение конкретной задачи.

ЗЫ: Кстати выращиваю и ловлю иногда, да. Это прикольно.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

возникают подобное непонимание

В этом месте стоит напомнить, что я спросил у лора есть ли что-то подобное тому, что я задумал.

то в чём проблема с job
заплатить за готовое решение

Платить за парсер логов? За что еще платить предлагаете, каждый раз за деплой виртуалки, за добавление туда ssh ключа?

Кстати выращиваю и ловлю иногда

Подозреваю что пищу вы принимаете не иногда, а регулярно. Эх вы, такой потенциал для обучения пропадает.

gistart
() автор топика
Ответ на: комментарий от gistart

Нет. Предполагаю, что человек, у которого есть рут на сервер и которому надо часто читать логи, сам является админом.

А вот мне наоборот: sql по памяти и без манов писать гораздо проще, чем на стандартных утилитах.

Думается мне, ты в меньшинстве.

shell-script ★★★★★
()
Ответ на: комментарий от pawnhearts

Там другое. И там всё-таки не для одноразового вывода инфы по запросу, а для анализа больших объёмных логов.

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от shell-script

человек, у которого есть рут на сервер и которому надо часто читать логи, сам является админом

Странно как-то. Вот я пишу код, а код пишет логи. Иногда нужно понять, что случилось — вот тут то возникает задача эти логи удобно читать.

gistart
() автор топика
Ответ на: комментарий от gistart

Платить за парсер логов? За что еще платить предлагаете, каждый раз за деплой виртуалки, за добавление туда ssh ключа?

Ну да, а в чём проблема. Не хотите научиться ловить рыбу самостоятельно или лень её ловить - покупаете её в магазине. Так ведь нормальные люди поступают?

Подозреваю что пищу вы принимаете не иногда, а регулярно.

Я не понял - если лень самому сделать/научиться, то заплатить чтобы получить готовенькое - это нормально или нет? Вы уж определитесь как-нибудь.

Эх вы, такой потенциал для обучения пропадает.

Это вообще о чём?

Stanson ★★★★★
()
Ответ на: комментарий от gistart

И вот тут люди придумали кучу удобных утилит для этого. В том числе такие вещи, как awk и perl(если не хватает cut, sort, uniq и пр). Поэтому твоё пожелание выглядит как минимум странным. Ты не захотел или не смог разобраться с утилитами, созданными(среди прочего) для анализа логов и говоришь, что ими неудобно анализировать логи.

Я понял, что тебе хочется читать текстовые файлики sql'ными запросами. Ок. Скорее всего тебе придётся писать такую утилиту самостоятельно. И в процессе у тебя возникнет немало трудностей как минимум с производительностью и постоянным разбором формата лога из-за чего твою утилиту нужно будет постоянно переписывать(или же настраивать свои сервера так, чтобы они выдавали лог, который сможет прочитать твоя утилита).

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Не знаю что вам со Stanson показалось, но если перечитать пост — я спросил не видел ли кто что-то подобное, уже реализовнное. Нужно или не нужно такое, по мнению лорчан, я не спрашивал — очевидно же что нинужно)

с производительностью

не знаю, даже мускуль может обслуживать довольно большие нагрузки, а тут всего-лишь парсер логов

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

то-то я смотрю awk каждый месяц переписывают

gistart
() автор топика
Последнее исправление: gistart (всего исправлений: 1)
Ответ на: комментарий от gistart

Вот я пишу код, а код пишет логи. Иногда нужно понять, что случилось — вот тут то возникает задача эти логи удобно читать.

Вот тебе ещё одна подсказка даром - есть такая штука как sqlite3 например. Если возникла задача удобно логи читать - слей их в sqlite и там хоть обSQLся. sqlite3 нынче искаропки есть в любом дистре. Ну или в любую другую БД, если у тебя она уже стоит.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Вот тебе ещё одна подсказка даром

Большое спасибо, выручили. Вот нжинкс дураки какие-то пишут, у них логи по дефолту текстовые, выгружаются в файл. Надо им с вами было проконсультироваться.

gistart
() автор топика
Ответ на: комментарий от gistart

я спросил не видел ли кто что-то подобное

И тебе сразу же ответили, что нет. И объяснили, почему.

даже мускуль может обслуживать довольно большие нагрузки

Ты действительно не видишь разницы между внутренним представлением данных в мускле и текстовым файлом?

то-то я смотрю awk каждый месяц переписывают

Слишком толсто.

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от gistart

Дураки какие-то плохо понимают то, что я написал. Вот в чём проблема взять текстовый лог и залить его в БД? А потом ковырять его любимым и знакомым SQLем сколько угодно?

И потом:

Вот я пишу код, а код пишет логи.

Вы nginx пишете?

Stanson ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.