在 stackdriver 日志记录中从 textPayload 中解析字段

Parsing fields out of textPayload in stackdriver logging

这是来自 tomcat 访问日志的一行:

127.0.0.1 - - [24/May/2016:17:53:05 -0700] "POST /users HTTP/1.1" 200 10676

有没有办法把客户端IP、HTTP请求方法、请求路径、响应代码等这里的各个字段解析出来,加载到BigQuery的单独列中table?

this page links to the fluent catch-all config底部的table,但我认为应该以可配置的方式解析出不同的日志并以不同的方式加载以便于查询?

还是我遗漏了一些基本的东西?

这可能不是你的意思 - 但只是猜测:

如何将日志加载到 GBQ table 中,以便每个日志行成为 table 中的行,而不是将其解析为另一个 table,如下所示(代码不是假装的)最佳 - 只是为了展示想法)

SELECT 
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){0} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){1} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){2} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){3} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){4} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){5} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){6} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){7} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){8} (.+?) '),
  REGEXP_EXTRACT(log_line, r'(?: (?:.+?)){9} (.+?) '),
FROM (
  SELECT ' ' + REGEXP_REPLACE(log_line, r'[\[\]\"]', '') + ' ' AS log_line 
  FROM 
    (SELECT '127.0.0.1 - - [24/May/2016:17:53:05 -0700] "POST /users HTTP/1.1" 200 10676' AS log_line)
)

您可以将其作为 "CSV" 导入吗? BigQuery 允许您指定自定义分隔符和引号字符。

127.0.0.1 - - [24/May/2016:17:53:05 -0700] "POST /users HTTP/1.1" 200 10676

您似乎可以提供一个 space 作为引号字符,并提供双引号作为(可选)引号。我希望上面的示例行解析为:

"127.0.0.1", "-", "-", "[24/May/2016:17:53:05", "-0700]", "POST /users HTTP/1.1", 200, 10676

时间戳 + 时区有点混乱,您最初需要将一些字段作为字符串导入,但您可以 post-使用查询处理(如 Mikhail 的回答)来修复它并避免使用另一个工具来配置和管理。