在Azure Monitor日志中运行导出作业(预览版)

使用 导出作业(预览版) 从 Log Analytics 工作区表导出历史记录。 导出作业是一种异步按需操作,用于将日志从单个表导出到Azure Blob 存储帐户。 根据 Kusto 查询语言 (KQL) 查询以及你指定的时间范围,结果将以 Parquet 格式写入 Blob 存储,并按小时划分到不同的文件夹中。

Scenario 说明
法律合规性和审核准备情况 从特定时间段导出日志以履行审核请求、支持法定保留或证明合规性。
高级安全调查 导出目标日志数据集以与第三方 SIEM 解决方案集成,或用于深入威胁调查、取证分析和交叉引用。
机器学习和商业智能 导出历史数据集,以便进行模型训练、验证,以及与用于报告和分析的企业数据仓库结合使用。

导出作业是对 Log Analytics 数据导出规则 的补充;这些规则会在新数据到达时持续进行流式传输,但无法回溯处理已进入工作区的数据。 导出作业填补了该空白。 如果需要在数据导出规则启动之前导出工作区中已有的历史数据,或者想要基于 KQL 查询导出特定记录子集,请使用导出作业。

本文介绍如何授予所需权限、通过 REST API 或 PowerShell 提交导出作业,以及如何监视作业完成。

Important

导出作业当前处于预览阶段。 有关适用于 beta 版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅 Azure 预览补充使用条款

先决条件

导出作业的运行方式

提交导出作业时,Azure Monitor 日志会将查询分配到多个并行分区中执行,并将结果导出到 Azure 存储帐户中按小时划分的文件夹。 作业的持续时间取决于扫描和导出的数据量,在导出数百 TB 时,作业的持续时间可以延长到几天。

内置重试机制管理暂时性故障,以便在导出所有数据时作业成功完成。 如果任何分箱失败,作业将以 Failed 状态终止。 在作业状态保留期间的七天内提交retry请求,以手动重试失败的分箱。

导出作业在独立于引入的计算上运行,因此对工作区引入或查询体验没有影响。

通过 Log Analytics REST API 创建和管理导出作业。 在存储帐户中以 Parquet Blob 的形式访问导出的数据。

导出作业权限

若要运行导出作业,需要对Log Analytics工作区拥有权限。 还必须授予工作区的系统分配托管标识对目标存储帐户的访问权限。

Action 所需权限 成员
运行导出作业并查询源表 Microsoft.OperationalInsights/workspaces/query/readMicrosoft.OperationalInsights/workspaces/jobs/export/action对 Log Analytics 工作区的权限(例如,由Log Analytics 读取器内置角色提供)。 User
查询表中的日志 Microsoft.OperationalInsights/workspaces/query/<table>/read 对 Log Analytics 工作区的权限,例如由 Log Analytics 读取者内置角色 提供的权限。 User
在工作区上创建系统分配的托管标识 例如,由Microsoft.OperationalInsights/workspaces/write提供的权限适用于日志分析工作区。 User
解析目标存储帐户终结点 Microsoft.Storage/storageAccounts/read例如,由Log Analytics 读取者内置角色提供的对存储帐户的权限。 工作区托管标识
写入目标存储帐户 例如,由“存储 Blob 数据参与者”内置角色提供的对存储帐户的 Microsoft.Storage/storageAccounts/blobServices/containers/writeMicrosoft.Storage/storageAccounts/blobServices/containers/deleteMicrosoft.Storage/storageAccounts/blobServices/containers/read 权限。 工作区托管标识

向Log Analytics工作区托管标识授予对Azure 存储的访问权限

Log Analytics 工作区的系统分配的托管标识会向 Azure 存储帐户进行身份验证,以写入导出的 Blob。 为每个工作区设置此标识一次。

步骤 1:在工作区上创建系统分配的托管标识

  1. 在 Azure 门户中,打开你的 Log Analytics 工作区。
  2. 在工作区左侧菜单中选择身份
  3. 在“ 系统分配 ”选项卡上,将 “状态 ”设置为 “开”,然后选择“ 保存”。

步骤 2:授予托管标识对目标存储帐户的写入访问权限

  1. 在Azure门户中,打开目标存储帐户。
  2. 选择 访问控制(IAM)>添加>添加角色分配
  3. 在“ 角色 ”选项卡上,选择“ 存储 Blob 数据参与者”,然后选择“ 下一步”。
  4. 在“成员”选项卡上,设置“分配对托管标识的访问权限”,然后选择“+ 选择成员”。
  5. “选择托管标识”窗格中,选择订阅和托管标识类型Log Analytics工作区,选择工作区,然后选择“选择”。
  6. 选择审核 + 分配

步骤 3:授予托管标识对存储帐户终结点的读取访问权限

重复执行角色分配过程,但这次将 Log Analytics 读取者 内置角色分配给同一托管标识。 此角色提供解析存储帐户终结点所需的 Microsoft.Storage/storageAccounts/read 权限。

导出作业注意事项

在提交导出作业之前,请考虑以下因素:

  • 通过 REST API 配置作业。 Azure 门户功能尚不可用。
  • 导出 Analytics 和 Basic 套餐中的表格。 该辅助计划不被支持。
  • 导出的数据会以 Parquet 格式写入。 尚不支持 JSON 格式。
  • Azure 专用链接 和网络安全边界尚不受支持。
  • 工作区复制故障转移可能会终止正在进行的作业。 无法在次要区域中创建新的导出作业。
  • 导出作业不支持基于 Azure 的访问控制 (ABAC) 条件。 如果在工作区中配置任何 ABAC 条件,或者如果受保护的表存在且没有足够的权限对其进行查询,则导出作业会在工作区级别失败,并返回 403(禁止)错误,而不显示详细的消息。
导出作业阈值 价值 备注
每个工作区的并发作业数 5(活动包括重试作业) 如果需要运行五个以上的作业,请在现有作业完成时按顺序提交它们。
作业超时 7 天 此超时足以导出几百 TB 的数据。 如果作业即将达到超时阈值,请考虑将导出范围限定为较小的时间范围或优化查询以减少扫描和导出的数据量。
每个作业的时间范围 整个表保留期内的时间范围最长可达 1 年 如果需要导出较长时间范围的数据,请提交具有不同时间范围的单独作业。
作业重试 每个 jobId 可重试 5 次(每次重试均需在最近一次作业完成后的 7 天内进行) 如果作业失败或超时,可以在最新作业完成时间的七天内重试该作业,或稍后提交新作业。

导出作业定价

导出作业根据两个 Azure Monitor 计量项计费:

  • 搜索作业按在源表中扫描的数据量计费。
  • Log Analytics 数据导出按目标 Azure 存储帐户中测得的导出数据量计费。

你需要为你的订阅中的目标 Azure 存储帐户容量付费,该费用不属于导出作业功能费用的一部分。

Log Analytics 数据导出计量项与数据导出规则共用。 若要区分发票上的数据导出规则费用或成本分析中的导出作业费用,请检查 “其他信息 ”字段。 导出作业带有 ExportType:Export job 标记。 数据导出规则标记有 ExportType:Data export rule

有关定价详细信息,请参阅 Azure Monitor 定价

确保数据完整性

导出作业旨在处理数百 TB 的日志,并包括一种重试机制来克服查询、网络或存储中的暂时性问题。 如果某个作业失败,一个或多个分箱可能没有结果。 可以在原始作业完成后的七天内完成导出,方法是将 retry 操作与操作 jobId一起使用。 重试过程经过优化,可以解决不完整或缺失的数据,同时跳过已成功导出的数据,从而阻止目标中的重复项。

若要检查活动作业和已完成作业的状态,请在工作区上启用 作业 诊断设置,然后查询 LAJobLogs 表。 最多可以在最新作业完成时间的七天内启动最多五次重试尝试。

以下示例查询返回过去七天内失败的作业:

LAJobLogs
| where TimeGenerated > ago(7d)
| where Status == "Failed"
| sort by TimeGenerated asc

管理导出作业

使用作业配置参数通过 REST API 管理导出作业。 API 支持用于创建作业、状态检查、重试和取消的操作。

单个作业允许配置最多 10 个存储帐户,以解决存储速率限制方案,确保数据高效分布。 当目标未与其他高带宽任务共享时,单个存储账户就足够了。

导出作业 API 参数

以下参数定义导出作业请求:

属性名称 说明
startTime 导出开始时间。 必须早于当前时间。
endTime 导出结束时间。 必须晚于 startTime 且早于当前时间。
query 使用 搜索作业 支持的 Kusto 查询语言命令编写的筛选搜索。
destinationStorageAccounts 存储帐户资源 ID。 例如: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Storage/storageAccounts/<storage-account-name>

在大多数情况下,单个存储帐户就足够了。 如果目标被限流,最多可包含 10 个存储账户。 导出的数据在存储帐户之间划分。
containerName 存储帐户中的容器名称。 容器可以已经存在;如果不存在,则会创建它。
outputDataFormat 存储帐户中的数据格式。 目前仅支持 Parquet。 尚不支持 JSON。
dateTimeFormat 存储帐户路径中的日期/时间格式。 支持的值是 yyyy-MM-ddTHH (默认值) 和 year=yyyy/month=MM/day=dd/hour=HH

路径示例:<container-name>/workspaceId/<workspace-id>/jobId/<job-id>/timestamp=<datetime>

估算导出任务大小

在提交导出作业之前,请估算数据量,以便确定是否将导出范围限定为较小的时间范围。

注释

以下查询使用 Usage 过去 30 天内的数据来估算量。 正常Azure Blob 存储费用适用。

如果要导出给定时间范围的所有数据,请仅指定表中 query的名称。 如果要导出记录的子集,请使用与 搜索作业 相同的 KQL 约定编写搜索查询,并验证它仅返回所需的记录。

例如,若要估计在 StorageBlobLogs 90 天内导出所有数据,请在工作区中运行以下查询。 结果显示所涉及的总量,以及该作业是否可能超时。

// Definitions
let maxExportGBperDay = 10000;       // assessed max daily GB during preview
let maxExportDurationDays = 7;        // max job runtime in days
//---------------------------------
// Job parameters
let exportRangeDays = 90;             // export time range in days
let tableName = 'StorageBlobLogs';    // table to export
//----------------------------------
// Query
Usage
| where TimeGenerated > ago(30d)
| where DataType == tableName
| summarize last30dGB = sum(Quantity) / 1000   // 30-day ingestion in GB
| extend TotalGBforRange = last30dGB / 30 * exportRangeDays
| extend IsExceedLimit = iff(TotalGBforRange > maxExportDurationDays * maxExportGBperDay, true, false)
| project-away last30dGB

IsExceedLimittrue 时,作业可能会超时。请改为提交多个时间范围较小的作业。

为导出作业 API 调用生成 Bearer 令牌

对导出作业 API 的 REST 请求需要令牌 Authorization: Bearer 。 令牌定期过期,过期的令牌返回 403 Unauthorized 响应。 导出作业 API 使用数据平面终结点 api.loganalytics.io (等效于 api.loganalytics.azure.com)。 可通过几种方法获取令牌。

  • 如果使用Azure CLI,则az rest命令将为你处理令牌生成。
  • 如果你使用 Azure PowerShell,Invoke-AzRestMethod cmdlet 会为你处理令牌生成。
  • 对于直接 REST API 调用,请使用以下脚本之一生成令牌,然后将其粘贴为 Authorization REST 请求中的值。
az login --tenant aaaabbbb-0000-cccc-1111-dddd2222eeee
az account set --subscription aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
token=$(az account get-access-token --resource https://api.loganalytics.io --query accessToken -o tsv)
Connect-AzAccount -Tenant 'aaaabbbb-0000-cccc-1111-dddd2222eeee'
Set-AzContext -Subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
$tokenObj = Get-AzAccessToken -ResourceUrl "https://api.loganalytics.io" -AsSecureString
$token = ConvertFrom-SecureString -SecureString $tokenObj.Token -AsPlainText

创建导出作业

在创建导出作业之前,请确保工作区在目标存储帐户上具有 具有存储 Blob 数据参与者角色的系统分配托管标识 。 对于直接调用 REST API,还需要用于 Log Analytics 数据平面 API 的 持有者标记

提交以下请求以启动导出作业。 该操作是异步的,可能需要数天才能完成数百 TB。

专用Azure CLI命令不适用于此操作。 使用 az rest 直接调用 REST API。

subscriptionId="aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
resourceGroupName="myResourceGroup"
workspaceName="myWorkspace"
apiVersion="2025-06-01-preview"

apiEndpoint="https://api.loganalytics.io"
path="/v2/subscriptions/$subscriptionId/resourcegroups/$resourceGroupName"
provider="Microsoft.OperationalInsights/workspaces/$workspaceName"
queryString="?api-version=$apiVersion"
url="$apiEndpoint$path/providers/$provider/jobs/export$queryString"

az account set --subscription "$subscriptionId"

az rest --method post --url "$url" --body @body.json

body.json

{
  "startTime": "2026-01-01T00:00:00",
  "endTime": "2026-03-01T00:00:00",
  "query": "CommonSecurityLog",
  "destinationStorageAccounts": [
    "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/myStorageAccount"
  ],
  "containerName": "common-security-log-export",
  "outputDataFormat": "Parquet",
  "dateTimeFormat": "yyyy-MM-ddTHH"
}

注释

operationId保存请求返回的值。 这是你用来检查状态、取消或重试任务的 jobId

检查导出任务状态

使用导出作业 jobId 提交以下请求以检查作业状态。

专用Azure CLI命令不适用于此操作。 使用 az rest 直接调用 REST API。

subscriptionId="aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
resourceGroupName="myResourceGroup"
workspaceName="myWorkspace"
jobId="aaaa0000-bb11-2222-33cc-444444dddddd"
apiVersion="2025-06-01-preview"

apiEndpoint="https://api.loganalytics.io"
path="/v2/subscriptions/$subscriptionId/resourcegroups/$resourceGroupName"
provider="Microsoft.OperationalInsights/workspaces/$workspaceName"
queryString="?api-version=$apiVersion"
url="$apiEndpoint$path/providers/$provider/jobs/export/$jobId/status$queryString"

az account set --subscription "$subscriptionId"

az rest --method get --url "$url"

取消导出作业

使用导出作业 jobId 提交以下请求以取消作业。 在取消之前处理和导出的数据在目标Azure存储帐户中仍然可用,并相应地计费。

Warning

已取消的导出作业将永久终止,无法重试。

专用Azure CLI命令不适用于此操作。 使用 az rest 直接调用 REST API。

subscriptionId="aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
resourceGroupName="myResourceGroup"
workspaceName="myWorkspace"
jobId="aaaa0000-bb11-2222-33cc-444444dddddd"
apiVersion="2025-06-01-preview"

apiEndpoint="https://api.loganalytics.io"
path="/v2/subscriptions/$subscriptionId/resourcegroups/$resourceGroupName"
provider="Microsoft.OperationalInsights/workspaces/$workspaceName"
queryString="?api-version=$apiVersion"
url="$apiEndpoint$path/providers/$provider/jobs/export/$jobId/cancel$queryString"

az account set --subscription "$subscriptionId"

az rest --method post --url "$url"

重试导出作业

如果导出作业在服务耗尽其自动重试尝试后失败,或者由于大量数据而超时,请手动重试作业以完成导出。 手动重试会跳过已成功导出的数据,并且仅处理不完整或缺失的分箱,从而避免重复。

每个 jobId 仅允许手动重试导出作业最多五次。 每次重试必须在最新作业完成时间的七天内进行。 如果所有重试尝试都用尽,则作业会以 Failed 状态终止。

注释

无法重试取消的导出作业。

专用Azure CLI命令不适用于此操作。 使用 az rest 直接调用 REST API。

subscriptionId="aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
resourceGroupName="myResourceGroup"
workspaceName="myWorkspace"
jobId="aaaa0000-bb11-2222-33cc-444444dddddd"
apiVersion="2025-06-01-preview"

apiEndpoint="https://api.loganalytics.io"
path="/v2/subscriptions/$subscriptionId/resourcegroups/$resourceGroupName"
provider="Microsoft.OperationalInsights/workspaces/$workspaceName"
queryString="?api-version=$apiVersion"
url="$apiEndpoint$path/providers/$provider/jobs/export/$jobId/retry$queryString"

az account set --subscription "$subscriptionId"

az rest --method post --url "$url"

监控导出作业

监视目标Azure存储帐户和导出作业执行。

监视目标Azure存储帐户

针对目标存储帐户的 入口 指标设置警报,以检测何时接近存储帐户引入限制。 目标端限流会导致 bin 失败并触发重试。

Scope 指标命名空间 Metric Aggregation 每个存储帐户的阈值
<storage-account-name> 帐户 流入量 总和 低于存储账户引入上限的 80% 例如,中国北部常规用途 v2 的限制为 60 Gbps。 警报阈值为每分钟 335 GB。

有关详细信息,请参阅 存储帐户可伸缩性

当目标存储帐户受到限制时,请考虑使用其他应用程序不使用的独立存储帐户,或使用多个存储帐户配置导出作业,以便导出的数据分布在其中。

监控导出作业执行情况

若要监视导出作业操作,请在工作区上配置 诊断设置 并启用 “作业 ”类别。 作业操作(例如 StartedSucceededCanceledFailed)会发送到 LAJobLogs 表,你可在其中查询这些操作并创建警报。

若要配置诊断设置,请执行以下操作:

  1. 在 Azure 门户中,打开你的 Log Analytics 工作区。
  2. 在“ 监视”下,选择“ 诊断设置”。
  3. 选择“添加诊断设置”。
  4. “日志”下,选择 “作业 ”类别。
  5. “目标详细信息”下,选择“发送到Log Analytics工作区”,然后选择工作区。
  6. 提供名称并选择“ 保存”。

LAJobLogs 架构

表中的以下关键字段 LAJobLogs 与导出作业相关。 有关完整架构,请参阅 LAJobLogs

字段名称 说明
TimeGenerated 作业开始时间。
JobType Export 用于导出作业。
CorrelationId 用于支持故障排除的 GUID。
JobId 用于标识该作业的 GUID。 此 ID 在整个作业生命周期中使用,包括状态检查、取消和重试。
SourceTable 要导出的表。
Status 操作状态。 其中之一为StartedSucceededCanceledFailed
ResultsRecordCount 导出的记录数。
ResultsGB 目标处的数据量(以 GB 为单位)。
Message 操作详细信息。
Destination 目标详细信息,包括容器名称和存储帐户。

审核导出作业

监视和审核导出作业操作和查询,以确保安全性和符合性。

审核导出作业操作

创建、取消或重试导出作业时,审核事件将记录在Azure活动日志中,反映操作的状态,AcceptedStarted或者Succeeded

若要监视订阅中的导出作业操作,请配置 活动日志警报规则。 在Azure门户中,打开Azure Monitor,选择“警报”,然后创建新的警报规则。 在 “作用域”下选择订阅,然后在“ 条件 ”选项卡中选择导出作业操作。

审计导出作业查询

若要审核导出作业中使用的查询,请在工作区上配置 诊断设置 并启用 “审核 ”类别。 作业中使用的查询将发送到 LAQueryLogs 表。

查询导出到 Azure 存储中的数据

导出作业完成后,使用 Log Analytics 或 Azure 数据资源管理器 (ADX) 查询导出的 Parquet Blob。 两者都支持 KQL。

从 Log Analytics 查询特定 Blob

在以下情况下,在Log Analytics中使用 externaldata 运算符:

  • 您需要验证某个特定小时或少数几条日志。
  • 您希望无需搭建额外基础设施即可进行即席分析。
externaldata (
    TimeGenerated: datetime,
    Message: string,
    Severity: string,
    Facility: string
)
[
    @"https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/workspaceId/<workspace-id>/jobId/<job-id>/timestamp=2026-05-01T00/aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb.gz.parquet?<blob-sas-token>"
]
with (
    format="parquet"
)

查询从 ADX 导出的日志

在 Azure 数据资源管理器 (ADX) 群集中定义外部表,并使用函数(无需数据移动)对其进行查询external_table()。 在以下情况下使用此方法:

  • 需要跨多个 Blob 或大型数据集进行广泛的分析。
  • 需要持久架构并优化重复查询的性能。
.create external table ExportedLogs (TimeGenerated:datetime, Level:string, Message:string)
kind=blob
dataformat=parquet
(
    h@"https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>;<storage-account-key>"
)

external_table("ExportedLogs")
| summarize count() by Level

比较查询方法

能力 externaldata(Log Analytics) 外部表(ADX)
最适用于 快速验证,小范围 大规模重复查询
Setup 无(临时) 需要 ADX 群集
Performance 对于大数据量有限制 针对大数据优化
架构持久性 是的

将导出作业日志批量引入到 ADX

使用 LightIngest 将导出作业输出批量引入 ADX 群集。 建议将 LightIngest 用于大型的一次性引入作业,例如回填历史数据。 它支持包含 Parquet 的压缩格式,建议的文件大小介于 100 MB 和 1 GB 之间。 有关回填历史数据并设置creationTime引入属性的详细信息,请参阅将历史数据引入Azure 数据资源管理器