2016-06-10 73 views
1

我有一个logstash配置文件,我需要转换为厨师erb模板(主要是过滤器部分)。不过,由于格罗克模式的格式,我仍然遇到问题。 下面是grok模式的一个例子。厨师ERB模板与Logstash Grok模式问题

grok { 
    match => ["message", "<%{POSINT:seqnum1}>%{POSINT:seqnum2}: (\d*: |\.|\*)*%{SYSLOGTIMESTAMP:timestamp} %{WORD:tz}: \%%{WORD:facility_label}-(%{WORD:switch_id}-)*%{INT:severity}-%{WORD:program}: %{GREEDYDATA:message}"] 

这是问题。在此之后不久,我需要在IP地址中插入一些插值等。但它不会因为<%开始自己的插值。

mutate { 
    add_field => {"[@metadata][sentry][msg]" => "%{host}" 
    "[@metadata][sentry][severity]" => "%{severity}" 
    "[@metadata][sentry][host]" => "<%= @sentry_host[:ipaddress] %>" 
    "[@metadata][sentry][pid]" => "<%= @sentry_pid %>" 
    "[@metadata][sentry][key]" => "<%= @sentry_key %>" 
    "[@metadata][sentry][secret]" => "<%= @sentry_secret %>" 
    } 
} 

因此,上述所有值均作为字符串<%= @sentry_... %>进行处理。

有没有办法解决这个问题?我试过<%%{POSINT:seqnum1}>%{POSINT:seqnum2}:%>的逃生方法,看到here。但它仍然把关闭%> in。任何其他方式来转义ERB中的字符/字符串?

谢谢! Josh

回答

0

您不想将%>置于文字中。 <%%成为一个文字<%,它不需要配对的结束标签。的erb -x

编辑例如:

$ echo '<%% foo <%= asdf %> bar <%= baz %>' | erb -x 
#coding:ASCII-8BIT 
_erbout = ''; _erbout.concat "<% foo "; _erbout.concat((asdf).to_s); _erbout.concat " bar "; _erbout.concat((baz).to_s); _erbout.concat "\n" 
; _erbout.force_encoding(__ENCODING__) 
+0

感谢这么快是这个!但是,如果我执行了<%%,它将不会插入任何内容,直到“@sentry_host [:ipaddress]”之后关闭/结束“%>”“[@metadata] [sentry] [host]”=>“<% = @sentry_host [:ipaddress]%>“ ”[@metadata] [sentry] [pid]“=>”<%= @sentry_host [:ipaddress]%>“'结束为'\t”[@metadata] [哨兵] [主机]“=>”<%= @sentry_host [:ipaddress]%>“ \t”[@metadata] [sentry] [pid]“=>”10.100.100.100“' –

+0

这有点难这在一个评论中,但你总是可以将Erb的代码片段传递给'erb -x'来查看生成的Ruby代码,这应该让你知道发生了什么事情:) – coderanger