在 logstash 中检索 RESTful GET 参数
Retrieving RESTful GET parameters in logstash
我正在尝试让 logstash 解析来自我的 ELB 日志文件的 HTTP get 请求中的键值对。
请求字段看起来像
http://aaa.bbb/get?a=1&b=2
我希望在上面的日志行中有一个用于 a
和 b
的字段,但我无法弄明白。
我的 logstash conf(为清楚起见格式化)在下面,它没有加载任何额外的关键字段。我假设我需要拆分 URI 的地址部分,但还没有弄清楚。
input {
file {
path => "/home/ubuntu/logs/**/*.log"
type => "elb"
start_position => "beginning"
sincedb_path => "log_sincedb"
}
}
filter {
if [type] == "elb" {
grok {
match => [ "message", "%{TIMESTAMP_ISO8601:timestamp}
%{NOTSPACE:loadbalancer} %{IP:client_ip}:%{NUMBER:client_port:int}
%{IP:backend_ip}:%{NUMBER:backend_port:int}
%{NUMBER:request_processing_time:float}
%{NUMBER:backend_processing_time:float}
%{NUMBER:response_processing_time:float}
%{NUMBER:elb_status_code:int}
%{NUMBER:backend_status_code:int}
%{NUMBER:received_bytes:int} %{NUMBER:sent_bytes:int}
%{QS:request}" ]
}
date {
match => [ "timestamp", "ISO8601" ]
}
kv {
field_split => "&?"
source => "request"
exclude_keys => ["callback"]
}
}
}
output {
elasticsearch { host => localhost }
}
kv 将采用 URL 并拆分参数。此配置有效:
input {
stdin { }
}
filter {
mutate {
add_field => { "request" => "http://aaa.bbb/get?a=1&b=2" }
}
kv {
field_split => "&?"
source => "request"
}
}
output {
stdout {
codec => rubydebug
}
}
标准输出显示:
{
"request" => "http://aaa.bbb/get?a=1&b=2",
"a" => "1",
"b" => "2"
}
也就是说,我鼓励您创建自己的默认 URI 模式版本,以便它们设置字段。然后,您可以将查询字符串字段传递给 kv。这样更干净。
更新:
对于"make your own patterns",我的意思是利用现有的并根据需要进行修改。在 logstash 1.4 中,安装它们就像将它们放入 'patterns' 目录中的新文件一样简单;我还不知道 >1.4 的模式。
MY_URIPATHPARAM %{URIPATH}(?:%{URIPARAM:myuriparams})?
MY_URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{MY_URIPATHPARAM})?
然后您可以在您的 grok{} 模式中使用 MY_URI,它会创建一个名为 myuriparams 的字段,您可以将其提供给 kv{}。
我正在尝试让 logstash 解析来自我的 ELB 日志文件的 HTTP get 请求中的键值对。
请求字段看起来像
http://aaa.bbb/get?a=1&b=2
我希望在上面的日志行中有一个用于 a
和 b
的字段,但我无法弄明白。
我的 logstash conf(为清楚起见格式化)在下面,它没有加载任何额外的关键字段。我假设我需要拆分 URI 的地址部分,但还没有弄清楚。
input {
file {
path => "/home/ubuntu/logs/**/*.log"
type => "elb"
start_position => "beginning"
sincedb_path => "log_sincedb"
}
}
filter {
if [type] == "elb" {
grok {
match => [ "message", "%{TIMESTAMP_ISO8601:timestamp}
%{NOTSPACE:loadbalancer} %{IP:client_ip}:%{NUMBER:client_port:int}
%{IP:backend_ip}:%{NUMBER:backend_port:int}
%{NUMBER:request_processing_time:float}
%{NUMBER:backend_processing_time:float}
%{NUMBER:response_processing_time:float}
%{NUMBER:elb_status_code:int}
%{NUMBER:backend_status_code:int}
%{NUMBER:received_bytes:int} %{NUMBER:sent_bytes:int}
%{QS:request}" ]
}
date {
match => [ "timestamp", "ISO8601" ]
}
kv {
field_split => "&?"
source => "request"
exclude_keys => ["callback"]
}
}
}
output {
elasticsearch { host => localhost }
}
kv 将采用 URL 并拆分参数。此配置有效:
input {
stdin { }
}
filter {
mutate {
add_field => { "request" => "http://aaa.bbb/get?a=1&b=2" }
}
kv {
field_split => "&?"
source => "request"
}
}
output {
stdout {
codec => rubydebug
}
}
标准输出显示:
{
"request" => "http://aaa.bbb/get?a=1&b=2",
"a" => "1",
"b" => "2"
}
也就是说,我鼓励您创建自己的默认 URI 模式版本,以便它们设置字段。然后,您可以将查询字符串字段传递给 kv。这样更干净。
更新:
对于"make your own patterns",我的意思是利用现有的并根据需要进行修改。在 logstash 1.4 中,安装它们就像将它们放入 'patterns' 目录中的新文件一样简单;我还不知道 >1.4 的模式。
MY_URIPATHPARAM %{URIPATH}(?:%{URIPARAM:myuriparams})?
MY_URI %{URIPROTO}://(?:%{USER}(?::[^@]*)?@)?(?:%{URIHOST})?(?:%{MY_URIPATHPARAM})?
然后您可以在您的 grok{} 模式中使用 MY_URI,它会创建一个名为 myuriparams 的字段,您可以将其提供给 kv{}。