Google App Engine/BigQuery 日志搜索具有完整上下文的任意字符串

Google App Engine / BigQuery log search for arbitrary string with full context

我启用了 Google App Engine (GAE) 日志导出功能,因此可以使用 Google BigQuery 查询我的所有 App Engine 日志。

我想在过去 7 天的任何日志中找到特定的用户 ID。我能够通过下面的代码片段获得每个匹配的 protoPayload.line,但我无法显示完整的上下文,即匹配日志条目附带的 protoPayload.line 的所有其他实例。

SELECT
    metadata.timestamp AS Time,
    protoPayload.host AS Host,
    protoPayload.status AS Status,
    protoPayload.resource AS Path,
    protoPayload.line.logMessage
FROM
    (TABLE_DATE_RANGE(my_logs.appengine_googleapis_com_request_log_,
     DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), CURRENT_TIMESTAMP())
    )
WHERE
    protoPayload.line.logMessage like "%My Search String%"
ORDER BY time
limit 100

经过大量挖掘,下面是您在过去 7 天内如何对字符串 "My Search String" 进行完整上下文搜索。

一些注意事项:

  • 您必须将 my_logs 替换为您调用的任何 BigQuery 数据集。
  • 您可以更改两个位置的数字 -7 以更改您关心的日期范围。例如,-8 将定位过去 8 天。
  • 您可以添加您希望在外部 select 块中返回的附加信息,方法是将它们放在 [add more fields here] 的上方。
SELECT
  insertId,
  metadata.timestamp AS Time,
  protoPayload.host AS Host,
  protoPayload.status AS Status,
  protoPayload.resource AS Path,
  protoPayload.line.logMessage AS Message
  -- [add more fields here]
FROM (
  SELECT
    *
  FROM
    TABLE_DATE_RANGE(my_logs.appengine_googleapis_com_request_log_, DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), CURRENT_TIMESTAMP()) )
WHERE
  insertId IN (
  SELECT
    insertId
  FROM (TABLE_DATE_RANGE(my_logs.appengine_googleapis_com_request_log_, DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), CURRENT_TIMESTAMP()) )
  WHERE
    protoPayload.line.logMessage LIKE "%My Search String%" )
ORDER BY
  insertId
LIMIT 100

可能有一种方法可以不出现奇怪的TABLE_DATE_RANGE重复,所以如果有人知道,请告诉我!

以下是我如何编写您的查询而不 TABLE_DATE_RANGE 重复。搜索条件我也把LIKE改成了CONTAINS

SELECT
  insertId,
  metadata.timestamp AS Time,
  protoPayload.host AS Host,
  protoPayload.status AS Status,
  protoPayload.resource AS Path,
  protoPayload.line.logMessage AS Message
  -- [add more fields here]
FROM
  TABLE_DATE_RANGE(my_logs.appengine_googleapis_com_request_log_, DATE_ADD(CURRENT_TIMESTAMP(), -7, 'DAY'), CURRENT_TIMESTAMP())
OMIT RECORD IF
  EVERY(NOT protoPayload.line.logMessage CONTAINS "My Search String")
ORDER BY
  insertId
LIMIT 100