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
我启用了 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