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

Azure Log Analytics Workspace Python查询BadArgumentError报错求助

问题原因

你的代码在拼接查询时犯了KQL逻辑顺序错误:

原log_query已经通过summarize count() by Computer对数据做了聚合,聚合后的结果集只包含Computer和count_两列,不再存在TimeGenerated列。但你又在聚合之后拼接了一段where TimeGenerated >= ...的过滤条件,导致KQL无法找到TimeGenerated列,触发语义错误。

拼接后的完整错误查询如下:

Heartbeat
| where TimeGenerated > ago(1h)
| summarize count() by Computer
| where TimeGenerated >= datetime(202X-XX-XXTXX:XX:XXZ) and TimeGenerated <= datetime(202X-XX-XXTXX:XX:XXZ)
解决方案

有两种可行的修正方式:

方式一:利用timespan参数自动过滤(推荐)

LogsQueryClient的query_workspace方法已提供timespan参数,会自动过滤TimeGenerated在指定范围内的数据,无需手动在KQL中拼接时间条件。直接去掉代码中拼接的where语句即可:

def query_logs():
    credential = authenticate()
    try:
        logs_query_client = LogsQueryClient(credential)
        end_time = datetime.utcnow()
        start_time = end_time - time_range
        # 直接使用原log_query,不再拼接额外的where条件
        query = log_query
        timespan = (start_time, end_time)
        response = logs_query_client.query_workspace(monitor_resource_id, query, timespan=timespan)
        for table in response.tables:
            for row in table.rows:
                print(row)
    
    except HttpResponseError as e:
        print(f"HTTP Response Error: {e.message}")
        print(f"Response status code: {e.status_code}")
        print(f"Error details: {e.error}")
    except Exception as e:
        print(f"An error occurred: {e}")

方式二:手动将时间过滤放在聚合之前

如果一定要手动写时间过滤逻辑,需把拼接的where条件放到summarize之前,确保过滤时TimeGenerated列仍存在:

def query_logs():
    credential = authenticate()
    try:
        logs_query_client = LogsQueryClient(credential)
        end_time = datetime.utcnow()
        start_time = end_time - time_range
        # 定义时间过滤语句
        time_filter = f"| where TimeGenerated >= datetime({start_time.strftime('%Y-%m-%dT%H:%M:%SZ')}) and TimeGenerated <= datetime({end_time.strftime('%Y-%m-%dT%H:%M:%SZ')})"
        # 拆分原查询,在summarize行前插入时间过滤
        log_query_lines = log_query.strip().split('\n')
        for i, line in enumerate(log_query_lines):
            if 'summarize' in line:
                log_query_lines.insert(i, time_filter)
                break
        query = '\n'.join(log_query_lines)
        timespan = (start_time, end_time)
        response = logs_query_client.query_workspace(monitor_resource_id, query, timespan=timespan)
        for table in response.tables:
            for row in table.rows:
                print(row)
    
    except HttpResponseError as e:
        print(f"HTTP Response Error: {e.message}")
        print(f"Response status code: {e.status_code}")
        print(f"Error details: {e.error}")
    except Exception as e:
        print(f"An error occurred: {e}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:42:18