LINUX.ORG.RU

regexp вытащить строку после ключевого слова

 ,


0

2

Доброго времени суток! Есть лог,такого вот формата

[09.08.16 16:52:55] LOGLEVEl MESSAGE 
Нужно распарсить его в одной строке на составные части(для grok в logstash), т.е. дата, логлевел и сообщение. Написаны след. регэкспы
DATE (\d{2}\.\d{2}\.\d{2})
TIME (\d{2}:\d{2}:\d{2})
DATETIME %{DATE} %{TIME}
LOGLEVEL (TRACE|DEBUG|NOTICE|INFO|WARN?(?:ING)?|ERR?(?:OR)?|CRIT?(?:ICAL)?|FATAL|SEVERE|EMERG)
LOGMESSAGE ((TRACE|DEBUG|NOTICE|INFO|WARN?(?:ING)?|ERR?(?:OR)?|CRIT?(?:ICAL)?|FATAL|SEVERE|EMERG))(.*?)(\n|$) 
Так вот LOGMESSAGE возвращает строку начиная от LOGLEVEL и до конца строки, по этой причине не получается использовать в одном выражении LOGLEVEL и LOGMESSAGE. Может кто подсказать, возможно ли вытащить из лога только MESSAGE, начиная от LOGLEVEL и до конца строки, не включая сам LOGLEVEL, т.е из строчки
abcdef LOGLEVEL dbhsbf[2]]3smna_/d)
,надо получить только
dbhsbf[2]]3smna_/d
. Получить с помощью регэскпа хочу получить как-то так:

  • datetime:  "09.08.16 16:52:55"
  • loglevel: INFO|ERROR|WARN
  • LOGMESSAGE:dbhsbf[2]]3smna_/d


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

Есть лог, такого вот формата [09.08.16 16:52:55] LOGLEVEl MESSAGE Нужно распарсить его в одной строке на составные части, т.е. дата, логлевел и сообщение

И на кой хрен для этого регулярные выражения?

Zmicier ★★★★★
()

А теперь давай ты прочитаешь описание разметки LORCODE (ссылка прямо под полем ввода сообщения) и перепишешь свою нечитабельную словесную кашу с помощью переводов строк и тегов [code]..[/code], хорошо?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от Zmicier

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

excite
() автор топика
Ответ на: комментарий от deep-purple

Раздолбил регэкспами вот этими

 DATE (\d{2}\.\d{2}\.\d{2})
TIME (\d{2}:\d{2}:\d{2})
LOGLEVEL (TRACE|DEBUG|NOTICE|INFO|WARN?(?:ING)?|ERR?(?:OR)?|CRIT?(?:ICAL)?|FATAL|SEVERE|EMERG)
LOGMESSAGE ((TRACE|DEBUG|NOTICE|INFO|WARN?(?:ING)?|ERR?(?:OR)?|CRIT?(?:ICAL)?|FATAL|SEVERE|EMERG))(.*?)(\n|$) [/]code

excite
() автор топика
Ответ на: комментарий от deep-purple

Сам лог файл пишется построчно из приложения, т.е в конце строки \n стоит. Строчки лога, долбил только на целевые поля.

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

Ок. На чем долбил на поля? Я не знаючто за логсташ, там есть регексп? Сам регексп я тебе напишу быстро, но тут важно для какой шляпы его писать, может быть разница.

Ну на от балды, может не взлететь:

/^\[
(?P<DATE>\d{2}\.\d{2}\.\d{2})
\s+
(?P<TIME>\d{2}:\d{2}:\d{2})
\]\s+
(?P<LOGLEVEL>TRACE|DEBUG|NOTICE|INFO|WARN|WARNING|ERR|ERROR|CRIT|CRITICAL|FATAL|SEVERE|EMERG)
\s+
(?P<LOGMESSAGE>.*)
$/su

Переводы строк убрать, это одна спагеттина.

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

Долбил grok'ом (анализатор текста) который встроен в logstash, поддерживает регэкспы. Спасибо за регулярку, примерно понял, что надо поправить, буду пробовать.

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

Если подскажете, как сделать без регулярок, буду благодарен

Вы, например, не видите, что здесь имеют место четыре поля, разделенные пробелами?

$ line='[09.08.16 16:52:55] LOGLEVEl MESSAGE'
$ read date time loglevel message <<< "$line"
$ date=${date#[}
$ time=${time%]}
$ printf 'datetime: «%s %s» loglevel: %s LOGMESSAGE: %s\n' "$date" "$time" "$loglevel" "$message"
datetime: «09.08.16 16:52:55» loglevel: LOGLEVEl LOGMESSAGE: MESSAGE

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

$ datetime=${line:1:17}
$ read loglevel message <<< "${line:19}"
$ printf 'datetime: «%s» loglevel: %s LOGMESSAGE: %s\n' "$datetime" "$loglevel" "$message"
datetime: «09.08.16 16:52:55» loglevel: LOGLEVEl LOGMESSAGE: MESSAGE
Zmicier ★★★★★
()

Пиши лог сразу в нормальном формате, чтобы потом не изобретать его разбор.

anonymous
()
12 января 2017 г.
Ответ на: комментарий от Zmicier

Лучше поздно чем никогда В итоге вышло для грока

FULL_LOG %{WORKER:worker} #\d+	\[%{DATETIME_PR:timestamp}\] %{LOGLEVEL:loglevel}: %{GREEDYDATA:_message}

где

GREEDYDATA .*

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