这是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,但我相信不同的日志应该以可配置的方式解析和加载,以便于查询?
或者我错过了一些基本的东西?
答案 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的答案)来修复它并避免 - 另一个配置和管理工具。