# Rubyフィルターで指定したフィールドを特定フィールド配下に格納したい

**URL:** <https://discuss.elastic.co/t/ruby/306516>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [June 7, 2022, 2:41am UTC](https://discuss.elastic.co/t/ruby/306516 "2022-06-07T02:41:41Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [June 7, 2022, 2:41am UTC](https://discuss.elastic.co/t/ruby/306516/1 "2022-06-07T02:41:41Z")

</div>

下記の構成のドキュメントをlogstashからElasticsearchに連携しております

```auto
～省略～
"timestamp_log": "2022-06-03T09:01:28.000+09:00",
"awsRegion": "us-east-1",
"requestParameters": {
  "template": false,
  "resourceId": "5tfEXAMPLE",
  "restApiId": "3rbEXAMPLE"
～省略～
}

```

logstashのrubyフィルターにて、指定したフィールドを[xxxxx]フィールド配下にネストした構成としたく、下記のようなrubyを実装しました

```auto
 ruby {
   code => "
     def set_fields(whitelist, event)
       whitelist.each { |field| event.set([xxxxx] + field, event.get(field)) }
     end

     whitelist = [
       '[requestParameters][resourceId]'
     ]

     set_fields(whitelist, event)
    "
 }

```

[requestParameters][resourceId]フィールドの値が、[xxxxx][requestParameters][resourceId]フィールドに格納されることを期待したのですが、rubyのエラーメッセージが出力されて期待通りになりませんでした。  
whitelist 内は今後も増える可能性があり、[xxxxx]配下に格納するフィールド名は外出ししてset\_fieldsに渡す構成としたいです。どのように実装すればよいかご教示頂けないでしょうか。

下記、取り込み時の異常メッセージです

```auto
[2022-06-07T11:14:23,345][ERROR][logstash.filters.ruby][XXXXXXXXXX][42b787348fcfa6e707285a36bb916d6b8a9242a44134beda222a85c1192fdb75] Ruby exception occurred: undefined local variable or method `xxxxx' for #<LogStash::Filters::Ruby:0x735b0767> {:class=>"NameError", :backtrace=>["(ruby filter code):5:in `block in set_fields'", "org/jruby/RubyArray.java:1809:in `each'", "(ruby filter code):5:in `set_fields'", "(ruby filter code):13:in `block in filter_method'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-filter-ruby-3.1.7/lib/logstash/filters/ruby.rb:93:in `inline_script'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-filter-ruby-3.1.7/lib/logstash/filters/ruby.rb:86:in `filter'", "/usr/share/logstash/logstash-core/lib/logstash/filters/base.rb:159:in `do_filter'", "/usr/share/logstash/logstash-core/lib/logstash/filters/base.rb:178:in `block in multi_filter'", "org/jruby/RubyArray.java:1809:in `each'", "/usr/share/logstash/logstash-core/lib/logstash/filters/base.rb:175:in `multi_filter'", "org/logstash/config/ir/compiler/AbstractFilterDelegatorExt.java:134:in `multi_filter'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:295:in `block in start_workers'"]}

```

---

<div class="post-metadata">

**Author:** ![Yos](https://avatars.discourse-cdn.com/v4/letter/y/ed8c4c/32.png) [@Yos](https://discuss.elastic.co/u/Yos)\
**Post date:** [June 7, 2022, 9:08am UTC](https://discuss.elastic.co/t/ruby/306516/2 "2022-06-07T09:08:16Z")

</div>

@t-nakata

以下のように「'」で[xxxxxx]を括るといけるようですので、お試しください。  
whitelist.each { |field| event.set([xxxxx] + field, event.get(field)) }  
↓  
whitelist.each { |field| event.set('[xxxxx]' + field, event.get(field)) }

---

<div class="post-metadata">

**Author:** ![t-nakata](https://avatars.discourse-cdn.com/v4/letter/t/8491ac/32.png) [@t-nakata](https://discuss.elastic.co/u/t-nakata)\
**Post date:** [June 8, 2022, 10:20am UTC](https://discuss.elastic.co/t/ruby/306516/3 "2022-06-08T10:20:48Z")

</div>

ありがとうございます。期待通りの動作になりました

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2022, 10:21am UTC](https://discuss.elastic.co/t/ruby/306516/4 "2022-07-06T10:21:44Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
