【问题标题】:How to query on multiple similar string values using "contains" in Azure Log Analytics?如何在 Azure Log Analytics 中使用“包含”查询多个相似的字符串值?
【发布时间】:2021-08-05 13:44:39
【问题描述】:

我有一个 ADF 管道,我正在尝试查询其故障日志。我需要根据我在管道运行中使用的参数分析日志。我的示例查询如下:

ADFPipelineRun
| project JobId, PLName, JobStatus, PL_param, Status
| where PLName == "org_daily_data_load"
| where Status == "Failed"
| where PL_param contains 'org_erp_sap'

这行得通。但我需要分析各种参数的结果。但参数相似但并不总是相同。它们因日期和时间而异,如下所示:

参数:

org_erp_sap_20201104_063418
ABC_ENV_D_20210329_174033
123_xyz_abc_20210801_101923
org_erp_sap_20210504_143418
123_xyz_abc_20210401_121923

正如您在上面看到的,日期不同,但参数中有一个共同的字符串部分。如果我想检查这些参数的日志,我必须手动更改每个查询的 where PL_param contains 子句中的参数,如下所示:

ADFPipelineRun
| project JobId, PLName, JobStatus, PL_param, Status 
| where PLName == "org_daily_data_load"
| where Status == "Failed"
| where PL_param contains 'org_erp_sap'


ADFPipelineRun
| project JobId, PLName, JobStatus, PL_param, Status 
| where PLName == "org_daily_data_load"
| where Status == "Failed"
| where PL_param contains 'ABC_ENV_D'


ADFPipelineRun
| project JobId, PLName, JobStatus, PL_param, Status 
| where PLName == "org_daily_data_load"
| where Status == "Failed"
| where PL_param contains '123_xyz_abc'

有没有办法让contains 子句只使用公共字符串部分来获取多个值,而不管后面的日期和时间戳信息如何?如下所示:

ADFPipelineRun
| project JobId, PLName, JobStatus, PL_param, Status 
| where PLName == "org_daily_data_load"
| where Status == "Failed"
| where PL_param contains 'org_erp_sap%' OR 'ABC_ENV_D%' OR '123_xyz_abc%'

这是我第一次使用 KQL 和 Azure Log Analytics,我不知道如何实现这一点。有人可以帮忙吗?

【问题讨论】:

    标签: azure azure-data-factory azure-data-explorer azure-log-analytics kql


    【解决方案1】:

    如果我理解正确,您只想将所有变量放在一个位置。为此,您可以使用let 语句,如下所示:

    let PLName = "org_daily_data_load";
    let StatusToLookFor = "Failed";
    // etc...
    ADFPipelineRun
    | project JobId, PLName, JobStatus, PL_param, Status 
    | where PLName == PLNameToLookFor
    | where Status == StatusToLookFor 
    | where PL_param contains 'org_erp_sap%' OR 'ABC_ENV_D%' OR '123_xyz_abc%'
    

    顺便说一句,如果您要查找完整的单词,那么使用 has 而不是 contains 会更有效,因为它使用索引。您还可以使用更方便的语法,例如:

    | where PL_param has_any ('org_erp_sap%', 'ABC_ENV_D%', '123_xyz_abc%')
    

    如果你想在查询的开头声明这个列表,那么你可以这样做:

    let PLParamsToLookFor = dynamic(['org_erp_sap%', 'ABC_ENV_D%', '123_xyz_abc%']);
    ADFPipelineRun
    ...
    | where PL_param has_any (PLParamsToLookFor)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      相关资源
      最近更新 更多