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

时间:2016-06-02 02:07:29

标签: google-bigquery fluentd stackdriver

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

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

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

this page底部的表格链接到fluent catch-all config,但我相信不同的日志应该以可配置的方式解析和加载,以便于查询?

或者我错过了一些基本的东西?

2 个答案:

答案 0 :(得分:2)

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

如何将日志加载到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)
)

答案 1 :(得分: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的答案)来修复它并避免 - 另一个配置和管理工具。