logstash解析nginx日志 output到s3

背景

最近开始收集客户的浏览访问记录数据,为以后的用户行为及用户画像打基础。数据的流转分析如下图所示:

流量日志收集

这篇博文讲的是  从 nginx 到s3 的过程,只涉及上图的一小部分,使用的是logstash,版本5.4.3

注意,之前让运维让安装,默认安装的1.4.5,往s3写入的过程各种报错,升级版本之后才成功。


Logstash

手机日志的插件,安装在服务器上可以解析日志,支持各种匹配,能很方便的让你从复杂的日志文件里面收集出你想要的内容,安装和使用请看官网教程


Nginx日志

日志的格式运维和前段可配合做调整,如需要cookie运维配合日志记录cookie;需要其他参数的话可以让前端在url后面带上。我们开看一段nginx记录的原始日志:

192.168.199.63 - - [07/Jul/2017:20:55:38 +0800] "GET /c.gif?ezspm=4.0.2.0.0&keyword=humidifiers&catalog=SG HTTP/1.1" 304 0 "http://m2.sg.65emall.net/search?keyword=humidifiers&ezspm=4.0.2.0.0&listing_origin=20000002" "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Mobile Safari/537.36" "140.206.112.194" 0.001 _ga=GA1.3.1284908540.1465133186; tma=228981083.10548698.1465133185510.1465133185510.1465133185510.1; bfd_g=bffd842b2b4843320000156c000106ca575405eb; G_ENABLED_IDPS=google; __zlcmid=azfbRwlP4TTFyi; ez_cookie_id=dce5aaf7-6eef-4193-b9d2-dd65dd0a2de5; 65_customer=9C7E020D4493C5A9,DPS:1dSKhm:7XnxmT6xJXDmu5h3mYdecAMwgmg; _ga=GA1.2.1284908540.1465133186; _gid=GA1.2.1865898003.1499149209

日志按空格分割,可以解读为:

第一个是客户端ip ;第二第三是 “-” 这里应该存的是用户的信息,如果没有的话就以 “-”代替;第四位是“[]”里面的内容,记录日志的服务器时间;再后面双引号里面的一长串是http请求的信息,格式是固定的 :“请求方式  请求url  http版本”;往后是http请求返回的code,数字类型;再是请求返回的内容大小;往后依次是当前的url、浏览器信息、服务器IP地址、请求耗时。如果后面还有就是cookie的信息。

最后面的cookie信息也是有规律的,以我这边的日志为例:


_ga=GA1.3.1284908540.1465133186; tma=228981083.10548698.1465133185510.1465133185510.1465133185510.1; bfd_g=bffd842b2b4843320000156c000106ca575405eb; G_ENABLED_IDPS=google; __zlcmid=azfbRwlP4TTFyi; ez_cookie_id=dce5aaf7-6eef-4193-b9d2-dd65dd0a2de5; 65_customer=9C7E020D4493C5A9,DPS:1dSKhm:7XnxmT6xJXDmu5h3mYdecAMwgmg; _ga=GA1.2.1284908540.1465133186; _gid=GA1.2.1865898003.1499149209

我需要取到ez_cookie_id 和 65_customer 两个信息。

logstash配置

filter

我们来创建一个logstash grok pattern:

grok{match => { "message" => "%{IP:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} /%{NOTSPACE:request_page} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_response}"      }}

这个pattern我只格式化到 服务器的返回code,需要往后可以按照格式继续加

然后还要把request_page里面的 url参数也解析出来,这里用kv插件解析:

kv{

source => "request_page"

field_split =>"&?"

value_split => "="

trim_value => ";"

include_keys => ["ezspm","keyword","info","catalog","referrer","categoryid","productid"]

}

url里面可能有很多参数值,可以用 include_keys 来选出你只想要的值

同理也可以用kv插件 取出 log里面的cookie

kv{

 source => "message"

 field_split =>" "

 value_split => "="

 trim_value => ";"

 include_keys => ["ez_cookie_id","65_customer"]

}

output

s3 {

 access_key_id => "access-id"

 secret_access_key => "access-key"

region => "ap-southeast-1"

prefix    => "nginxlog/%{+YYYY-MM-dd}"

bucket => "bi-spm-test"

time_file=> 60

codec => "json_lines"

}

这里注意 bucket 不用写 “s3://”,直接写最外层的 bucket文件夹名称,prefix可以实现按日志切割文件夹存放log

按上述配置,我的输出目录最终为:

s3://bi-spm-test/nginxlog/2017-07-07/ls.s3.....txt

按天切割文件夹,每天的日志放到没天的文件夹下面。

date配置

logstash默认是utc 时间,比我们晚8个小时,比如 

2017-07-07 06:00:00

产生的日志,存储到logstash 时间会变为,2017-07-06T22:00:00Z,此时不对日期处理,日志就会存储到 2017-07-06这个文件夹下面,可我明明是7月7号产生的log。

同时往s3 copy的时候 ,2017-07-06T22:00:00Z 这个时间 也会直接变成:

2017-07-06 22:00:00,这就造成了数据不准确的问题了。

在logstash社区有个小伙伴提出了同样的问题:date时区问题

这里我们用刀date filter来配置日期:

date {

locale=>"en"

match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss +0800"]

target => "@timestamp"

timezone => "UTC"

}

把timezone 就设定为UTC,在它的基础上再加8个小时。

然后 2017-07-07 06:00:00  这个时间 存储下来就是

2017-07-07T06:00:00Z  ,  这是一个IOS的date格式,理论上 拿来用的时候 要再加 8个小时,但是这里我 只需要它放到正确的文件夹下面,以及copy到s3的时候日期正确,所以这里用投机取巧的方式满足我的需求。


完善的logstash配置:

input {

file {

path => ["/etc/logstash/test.log"]

type => "system"

start_position => "beginning"

sincedb_path => "/dev/null"

}

}

filter{

grok{

match => { "message" => "%{IP:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:method} /%{NOTSPACE:request_page} HTTP/%{NUMBER:http_version}\" %{NUMBER:server_response}"      }

}

kv{

source => "message"

field_split =>" "

value_split => "="

trim_value => ";"

include_keys => ["ez_cookie_id","65_customer"]

}

kv{

source => "request_page"

field_split =>"&?"

value_split => "="

trim_value => ";"

include_keys => ["ezspm","keyword","info","catalog","referrer","categoryid","productid"]

}

urldecode {

all_fields => true

}

mutate{

remove_field=>["message","request_page","host","path","method","type","server_response","ident","auth","@version"]        }

if [tags]{ drop {} }

if ![ezspm] { drop{} }

if ![65_customer] {mutate { add_field => {"65_customer" => ""} }}

if ![categoryid] {mutate { add_field => {"categoryid" => 0} }}

if ![productid] {mutate { add_field => {"productid" => 0} }}

if ![keyword] {mutate { add_field => {"keyword" => ""} }}

if ![referrer]{mutate { add_field => { "referrer" => ""} }}

if ![info]{mutate { add_field => { "info" => ""} }}

date {

locale=>"en"

match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss +0800"]

target => "@timestamp"

timezone => "UTC"

}

mutate{remove_field =>  ["timestamp"]}

}

output {

s3 {

access_key_id => "access_id"

secret_access_key => "access_key"

region => "ap-southeast-1"

prefix    => "nginxlog/%{+YYYY-MM-dd}"

bucket => "bi-spm-test"

time_file=> 60

codec => "json_lines"

}

}

最终收集到的日志:

{"ez_cookie_id":"dce5aaf7-6eef-4193-b9d2-dd65dd0a2de5","productid":"20000000080550","65_customer":"9C7E020D4493C5A9,DPS:1dSKhm:7XnxmT6xJXDmu5h3mYdecAMwgmg","catalog":"SG","http_version":"1.1","referrer":"","@timestamp":"2017-07-07T20:55:58.000Z","ezspm":"4.20000002.22.0.0","client_ip":"192.168.199.63","keyword":"","categoryid":"0","info":""}


Copy到S3

copy dw.ods_nginx_spm

from 's3://bi-spm-test/nginxlog/2017-07-07-20/ls.s3'

REGION 'ap-southeast-1'

access_key_id 'access-id'

secret_access_key 'access-key'

timeformat 'auto'

FORMAT AS JSON 's3://bi-spm-test/test1.txt';

来查看下结果:


日志结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容