当安全日志位于 BigQuery 中(来自 Cloud Logging 接收器、Google Workspace 导出或您自己的管道),使用 EXPORT DATA 导出它们。它会将以换行符分隔的 JSON 写入 Cloud Storage 存储桶,然后您可以下载它。对于较小的结果,bq query –format=json 会直接打印行。无论哪种方式,首先在表的时间或分区列上过滤,因为 BigQuery 的计费是按扫描的数据量计算的。
BigQuery 是许多 Google Cloud 团队在 Cloud Logging 的默认保留期过后仍然保存日志历史记录的地方。Prime Core 具有超过 24,000 条独特的检测规则,这些规则映射到 676 个 MITRE ATT&CK 技术。下面是如何取出一个片段、清理它并在 LogTotal 中免费调查它的方式。
在您开始之前
权限。 您需要运行作业(BigQuery Job User),读取数据集(BigQuery Data Viewer),并写入导出存储桶。
了解表。 将 Cloud Logging 接收器设置为 BigQuery 会创建以日志命名的表,例如 cloudaudit_googleapis_com_activity,通常按时间戳分区。Workspace 导出有自己的架构。
先检查费用。 在 bq 查询中添加 –dry_run 以查看将扫描多少字节。如果数字让您皱眉,请添加更严格的时间过滤器。
选项 1:EXPORT DATA 到 Cloud Storage
EXPORT DATA OPTIONS (
uri = 'gs://my-bq-exports/audit-20261019/*.json',
format = 'JSON',
overwrite = true
) AS
SELECT *
FROM `my-project.audit_logs.cloudaudit_googleapis_com_activity`
WHERE timestamp >= TIMESTAMP('2026-10-19') AND timestamp < TIMESTAMP('2026-10-20');
URI 需要使用通配符(*),因为 BigQuery 可能会写入多个文件。下载并合并它们:
gcloud storage cp 'gs://my-bq-exports/audit-20261019/*' ./audit-20261019/
cat ./audit-20261019/*.json > bq_audit_20261019.jsonl
选项 2:bq 查询用于小结果
bq query --nouse_legacy_sql --format=json --max_rows=10000
'SELECT * FROM `my-project.audit_logs.cloudaudit_googleapis_com_activity`
WHERE timestamp >= TIMESTAMP("2026-10-19") AND timestamp < TIMESTAMP("2026-10-20")'
> bq_audit_small.json
jq -c '.[]' bq_audit_small.json > bq_audit_small.jsonl
–format=json 打印一个 JSON 数组,jq 将其展平成每行一个。
在 LogTotal 中上传、清理和审查
- 上传。 打开 logtotal.com 并将 .jsonl 文件拖放进去。
- 清理。
- 审查。
当出错时
| 症状 | 可能原因 | Fix |
|---|---|---|
| 查询扫描整个表 | 分区或时间列上没有过滤器 | 过滤时间戳(或 _PARTITIONTIME) |
| EXPORT DATA 在 URI 上失败 | URI 中没有通配符 | 使用 …/*.json |
| 写入存储桶时权限被拒绝 | 缺少存储对象创建权限 | 授予存储桶写入访问权限 |
| bq 输出截断在 100 行 | 默认 –max_rows | 设置 –max_rows,或使用 EXPORT DATA |
| 嵌套字段看起来很奇怪 | 重复和嵌套列保持其结构 | 预期的;这仍然是有效的 JSON |
FAQ
这与从 Cloud Logging 导出一样吗?
不是。Cloud Logging 有自己的导出。这份指南是针对已经在 BigQuery 表中的日志。
我可以在没有查询的情况下导出整个表吗
可以:bq extract –destination_format NEWLINE_DELIMITED_JSON 可将表或分区复制到 Cloud Storage。对于调查,通常过滤查询更好。