azure-log-analytics - 在 Azure Log Analytics 的查询中解析 IIS 日志
问题描述
Azure Log Analytics(又名 OMS)使用 Kusto QL。我们将 IIS 日志从 docker 容器发送到 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 之后列出的字段的所有索引都将关闭。例如,第二条记录的最后一个字段不会位于索引 16(从 0 开始),而是 19。
有没有更好的方法来解析这些日志,例如,通过定义字段的数量或类型?
解决方案
您可以尝试以下方向。
注意:如果您实际上不需要区分 theuser_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 |
推荐阅读
- ruby - 推送到 Heroku 时如何解决 Bundler 冲突?
- javascript - 如何从动作方法返回没有数据到成功回调?
- python - 如何使用管道和 FeatureUnion 添加功能
- git - 在 Powershell 中本地工作的 -split ' ' 在 Azure 管道 Powershell 任务中不起作用
- selenium-chromedriver - 如何摆脱在无头模式下运行时打开的新空镀铬窗口
- dns - 在子域下运行 Traefik 主反向代理需要什么?
- css - 如何在 Visual Studio 2019 上使用 Bootstrap 4 和 Sass
- python - Django + Nginx 主页点击问题
- android - retrofit2.Call 的单元测试
- karate - 我们如何在空手道功能文件的后台函数中传递多个参数