2016-08-11 6 views
0

Я использую fluentd для записи журналов nginx в elasticsearch с использованием плагина-хвоста. Регулярное выражение предназначен для разбора из полей:Регулярно проанализировать URL-адрес из журналов nginx

^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$ 

Я попытался изменить это далее к югу разделить путь в сервис и конечных полей. Служба - это просто первая часть URL-адреса, а конечная точка - это все до начала параметров запроса или включения явного идентификатора. Это то, что я придумал:

^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>\/(?<endpoint>(?<service>[^?\/]*)[^?\d]*)[^\"]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$ 

По большей части это работает нормально. Так, например, работает против следующий адрес создает поле службы service1 и конечную точку service1/hello/

127.0.0.1 - - [10/Aug/2016:10:32:13 +0000] "OPTIONS /service1/hello/6/ HTTP/1.1" 204 0 "http://hello.hello.com" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" 

Тем не менее, это также соответствует, когда число не предшествует косой чертой. URL-адрес: /service1/hel123lo/6/ приведет к полю конечной точки service1/hel

Как я могу сопоставить цифру, перед которой стоит только косая черта?

+0

Цифра с косой чертой - '\ d (? = /)'. –

+0

В вашем регулярном выражении есть 'sevice'! –

ответ

0

Игнорируя все, что в вашем вопросе, кроме последнего предложения, который, кажется, единственный ясный вопрос:

Как я могу соответствовать на цифре предшествуют только косую черту?

Попробуйте это:

(?<=/)\d+ 

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

+0

Остальная часть вопроса имеет решающее значение, поскольку он объясняет мой подход к разложению URL-адреса на его соответствующие части с помощью названных захватов. Мне нужно захватить весь URL-адрес до начала параметра запроса или цифру, которой предшествует косая черта – waynemetcalfe