Анализ журналов IIS в запросе Azure Log Analytics

Azure Log Analytics (также известная как OMS) использует Kusto QL. Мы отправляем наши журналы IIS из контейнеров докеров в Log Analytics, и я намерен использовать следующий запрос для анализа записей:

ContainerLog
| extend fields  = split(LogEntry, ' ')
| extend appname = tostring(fields[16])
| extend path = tostring(fields[4])

Вот две разные записи, которые я проанализировал вручную:

date       time     s-ip           cs-method  cs-uri-stem                     cs-uri-query     s-port   cs-username                c-ip           cs(User-Agent)                                                                  cs(Referer)                    sc-status  sc-substatus  sc-win32-status  time-taken   x-forwarded-for                  container-app
2019-11-29 17:37:49 ddd.dd.dd.ddd  GET        /ping.aspx                      -                80       -                          dd.dd.ddd.d    Go-http-client/1.1                                                              -                              200        0             0                12           dd.dd.ddd.d                      OurCustomValue  
2019-11-29 17:33:36 ddd.dd.dd.ddd  GET        /js/js_v4/jquery-functions.js   v=26.35.0.0      80       7vgnwjAzOsKcUpseaPykcQ--   dd.dd.ddd.d    Mozilla/5.0+(Windows+NT+10.0 +Win64 +x64 +rv:70.0)+Gecko/20100101+Firefox/70.0  https://site.domain.com/       200        0             0                14           dd.ddd.dd.dd:55001,+dd.dd.ddd.d  OurCustomValue  

Проблема в том, что поле «Пользовательский агент» может содержать пробел, который сбивает с толку синтаксический анализатор и разбивает его на другие поля. Таким образом, все индексы для полей, перечисленных после User-Agent, будут отключены. Например, последнее поле для 2-й записи будет не с индексом 16 (начиная с 0), а с индексом 19.

Есть ли лучший способ проанализировать эти журналы, скажем, путем определения количества или типов полей?


person Amir Keibi    schedule 29.11.2019    source источник
comment
это может быть полезно, если вы можете предоставить образец записи или две (с исходным форматом), и то, как вы хотите, чтобы она была проанализирована в ожидаемой выходной схеме.   -  person Yoni    schedule 29.11.2019


Ответы (1)


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

примечание: если вам на самом деле не нужно различать поля user_agent и referer, вы можете разместить их оба в одном поле, что и делается в приведенном ниже примере (и если вам действительно нужно их отдельно, вы можете применить определенную логику для анализа этого поля позже, после первого вызова parse)

datatable(s:string)
[
    '2019-11-29 17:37:49 ddd.dd.dd.ddd GET /ping.aspx - 80 - dd.dd.ddd.d Go-http-client/1.1 - 200 0 0 12 dd.dd.ddd.d OurCustomValue', 
    '2019-11-29 17:33:36 ddd.dd.dd.ddd GET /js/js_v4/jquery-functions.js v=26.35.0.0 80 7vgnwjAzOsKcUpseaPykcQ-- dd.dd.ddd.d Mozilla/5.0+(Windows+NT+10.0 +Win64 +x64 +rv:70.0)+Gecko/20100101+Firefox/70.0  https://site.domain.com/ 200 0 0 14 dd.ddd.dd.dd:55001,+dd.dd.ddd.d OurCustomValue',
]
| parse s with d:datetime " " t:timespan " " s_ip " " cs_method " " cs_uri_stem " " cs_uri_query " " s_port:int " " cs_username " " c_ip " " cs_user_agent " " sc_status:int " " sc_substatus:int " " sc_win32_status:int " " time_taken:int " " x_forwarded_for " " container_app
| project appname = container_app, path = cs_uri_stem, browser_family = parse_user_agent(cs_user_agent, "browser").Browser.Family

это выведет:

| appname        | path                          | browser_family |
|----------------|-------------------------------|----------------|
| OurCustomValue | /ping.aspx                    | Go-http-client |
| OurCustomValue | /js/js_v4/jquery-functions.js | Firefox        |
person Yoni    schedule 29.11.2019