Я использую 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
Как я могу сопоставить цифру, перед которой стоит только косая черта?
Цифра с косой чертой - '\ d (? = /)'. –
В вашем регулярном выражении есть 'sevice'! –