0

这是tomcat访问日志中的一行:

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

有没有办法解析这里的各种字段,如客户端 IP、HTTP 请求方法、请求路径、响应代码等,并将其加载到 BigQuery 表中的单独列中?

本页底部的表格链接到fluent catch-all config,但我认为应该以可配置的方式解析不同的日志并以不同的方式加载以便于查询?

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

4

2 回答 2

3

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

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

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)
)
于 2016-06-02T18:51:29.053 回答
0

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

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

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

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

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

于 2016-06-03T22:09:33.167 回答