【问题标题】:Chef ERB template with Logstash Grok pattern issues带有 Logstash Grok 模式问题的 Chef ERB 模板
【发布时间】:2016-10-11 22:25:30
【问题描述】:

我有一个 logstash 配置文件,我需要将其转换为 chef erb 模板(主要是过滤器部分)。但是,由于 grok 模式的格式,我一直遇到问题。 下面是 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 地址等中进行一些插值填充。但它不会因为&lt;% 开始自己的插值。

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 %>"
  }
}

所以上面所有的值都被处理为&lt;%= @sentry_... %&gt;的字符串。

有没有办法解决这个问题?我试过&lt;%%{POSINT:seqnum1}&gt;%{POSINT:seqnum2}:%&gt;的转义方法见here。但它仍然将结束 %&gt; 放入。还有其他方法可以在 ERB 中转义字符/字符串吗?

谢谢! 乔什

【问题讨论】:

    标签: chef-infra erb chef-recipe chef-template


    【解决方案1】:

    您不想在文本中添加%&gt;&lt;%% 变成文字 &lt;% 并且不需要成对的结束标记。

    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__)
    

    【讨论】:

    • 感谢您这么快就参与进来!但是,如果我执行 " 之后 "@sentry_host[:ipaddress]" "[@metadata][sentry][host]" =&gt; "&lt;%= @sentry_host[:ipaddress] %&gt;" "[@metadata][sentry][pid]" =&gt; "&lt;%= @sentry_host[:ipaddress] %&gt;" 最终成为 ` "[@metadata][sentry][host]" => "" "[@metadata][sentry][pid]" => "10.100.100.100"`
    • 在评论中理解这一点有点困难,但您始终可以通过管道将 Erb 的 sn-p 发送到 erb -x 以查看生成的 Ruby 代码,这应该让您了解正在发生的事情上:)
    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多