You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中LogsQueryClient执行KQL查询返回0行问题求助

问题:Python调用KQL查询返回0行(Log Analytics中正常)

问题场景

以下KQL查询在Log Analytics资源管理器中执行可正常返回结果:

let endDateTime = now();
let startDateTime = ago(1d);
AnyTableName
| where TimeGenerated < endDateTime
| where TimeGenerated >= startDateTime

但通过Python代码调用时,返回0行数据。Python代码如下:

credential  = DefaultAzureCredential()

client = LogsQueryClient(credential)

query="""let endDateTime = now();
let startDateTime = ago(1d);
AnyTableName
| where TimeGenerated < endDateTime 
| where TimeGenerated >= startDateTime"""

print (query)

os.environ['LOGS_WS_ID'] = 'XXXX'

start_time=datetime(2022, 11, 4, tzinfo=timezone.utc)
end_time=datetime(2022, 11, 5, tzinfo=timezone.utc)

try:
    response = client.query_workspace(os.environ['LOGS_WS_ID'], query, timespan=(start_time, end_time))    
    if response.status == LogsQueryStatus.PARTIAL:
        error = response.partial_error
        print(error.message)
    elif response.status == LogsQueryStatus.SUCCESS:
        print("SUCCESSSSS")
        data = response.tables
    for table in data:
        df = pd.DataFrame(data=table.rows, columns=table.columns)
        print(df)
except HttpResponseError as err:
    print("Well !!! This is no good")
    print (err)

执行结果:

[0 rows x 29 columns]

原因分析

问题核心是Python调用时传入的timespan参数与KQL内的时间过滤条件形成了双重交集过滤:

  • KQL中用now()和ago(1d)取的是当前时间往前1天的动态区间
  • Python代码指定了固定的2022-11-4至2022-11-5静态区间
  • 当执行脚本时,当前时间不在该静态区间内,两个时间范围无交集,因此返回0行

解决方案

两种可行方案任选其一:

方案1:移除Python中的timespan参数

让KQL自身控制时间范围,删除query_workspace调用中的timespan参数:

response = client.query_workspace(os.environ['LOGS_WS_ID'], query)

方案2:统一时间范围控制

去掉KQL内的时间变量和过滤逻辑,完全依赖Python的timespan参数控制查询区间(Log Analytics API会自动对TimeGenerated应用该区间过滤):
修改后的KQL:

AnyTableName

Python调用保持原timespan参数即可。

或者将Python的时间参数传入KQL,实现动态可控:

# 定义时间参数
start_time=datetime(2022, 11, 4, tzinfo=timezone.utc)
end_time=datetime(2022, 11, 5, tzinfo=timezone.utc)

# 格式化KQL,传入时间参数
query=f"""AnyTableName
| where TimeGenerated < datetime({end_time.isoformat()})
| where TimeGenerated >= datetime({start_time.isoformat()})"""

# 调用时无需传入timespan
response = client.query_workspace(os.environ['LOGS_WS_ID'], query)

内容的提问来源于stack exchange,提问作者Asimananda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:41:41