logstash为变量赋值并执行perl脚本

logstash为变量赋值并执行perl脚本,logstash,logstash-grok,Logstash,Logstash Grok,我试图分配“actor”:“githubuser”像$actor=“gituser”和$repo=“gituser/logstashrepo”,如果我得到了变量的值,我可以使用复制到这里的exec函数执行脚本。请分享你的想法 总产量为 { _index: "logstash-2014.11.20", _type: "syslog", _id: "76ggV_gfWS5u2L9rcMNCWaQ", _score: 0.35005248, _source: { message: "github_au

我试图分配“actor”:“githubuser”像$actor=“gituser”和$repo=“gituser/logstashrepo”,如果我得到了变量的值,我可以使用复制到这里的exec函数执行脚本。请分享你的想法

总产量为

{
_index: "logstash-2014.11.20",
_type: "syslog",
_id: "76ggV_gfWS5u2L9rcMNCWaQ",
_score: 0.35005248,
_source: {
message: "github_audit: {"actor_ip":"192.168.1.1","from":"repositories#create","actor":"gituser","repo":"gituser/logstashreppo","action":"staff.repo_route","created_at":1236483708817,"repo_id":44758,"actor_id":1033,"data":{"actor_location":{"location":{"lat":null,"lon":null}}}}",
@version: "1",
@timestamp: "2014-11-17T11:41:50.142Z",
host: "192.168.1.1",
type: "syslog",
syslog5424_pri: "190",
timestamp: "Nov 17 03:41:50",
actor_ip: "192.168.1.1",
from: "repositories#create",
actor: "gituser",
repo: "gituser/logstashrepo",
action: "staff.repo_route",
created_at: 1236483708817,
repo_id: 44758,
actor_id: 1033,
data: {
actor_location: {
location: {
lat: null,
lon: null
}
}
}
}
}
,

我的配置文件是:

filter {
  grok {
    match => [
      "message",
      "%{SYSLOG5424PRI}%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:host} %{GREEDYDATA:message}"
    ]
    overwrite => ["host", "message"]
  }
  if [message] =~ /^git_audit: / {
    grok {
      match => ["message", "^git_audit: %{GREEDYDATA:json_payload}"]
    }
    json {
      source => "json_payload"
      remove_field => "json_payload"
    }
mutate {
  rename => ["[json][repo]", "repo"]
  remove_field => "json"
}
  }
}

input {
exec {
    type => "audit-log"
    command => "perl test.pl $actor"

  }
}
output {
  elasticsearch { host => localhost }
  stdout { codec => rubydebug }
}

这里有一个例子正好说明了你想要什么

另请参见,但请注意,
%{fieldname}
语法在所有字符串中都不起作用(它在哪里起作用,在哪里不起作用,也没有很好的文档记录)

最后,请注意,
type
属性对于像exec这样的输出插件是不推荐的。你应该这样重写它:

if [type] == "audit-log" {
    exec {
        command => "perl test.pl %{actor}"
    }
}

您发布了带有未终止字符串的无效JSON。检查转义的引号。另请参见:谢谢,我可以在内部执行脚本,但是,我正在从我粘贴问题的输出中查找特定的三个值,一旦我分别获得这三个值,我将在perl执行部分将这些值传递给我的脚本(我实际上是从我粘贴问题的输出中查找这三个值(从:“repositories#create”,actor:“gituser”,repo:“gituser/logstashrepo”,对不起,我不明白。如果actor是“gituser”,repo是“gituser/logstashrepo”等等,你想运行脚本吗?我实际上只希望从整个输出中得到“gituser”和“gituser/logstashrepo”输出(我在最初的问题中复制了整个输出)我将使用这两个值执行我的perl脚本,非常感谢您只想从JSON对象中提取这三个字段?好吧,但这是一个完全不同的问题(我想我几天前已经回答了–让“json”过滤器将结果存储在子字段中,将要保存的字段移动到顶层,然后删除子字段)。感谢您的帮助,因为我是这个设置的新手,所以我能够将这些字段置于顶部,但是,我无法将这些字段分配给任何变量。我希望仅从输出中提取这三个字段,并将其分配给perl脚本输入的变量。再次感谢
if [type] == "audit-log" {
    exec {
        command => "perl test.pl %{actor}"
    }
}