I would like to use the device name I have in the dictionary_path in the translate filter but I am having issues with it. is it even possible?
something like
translate {
field => "name"
destination => "lookUp"
dictionary_path => "/name.yml"
}
I would like to use the device name I have in the dictionary_path in the translate filter but I am having issues with it. is it even possible?
something like
translate {
field => "name"
destination => "lookUp"
dictionary_path => "/name.yml"
}
Hi,
yes it is possible I am using the translate
feature a lot.
translate {
field => "name"
destination => "lookUp"
dictionary_path => "name.yml"
}
the issue is with /name.yml
you say to logstash to look at the root folder /
. You just want to use name.yml
if it is inside the same directory as your pipeline is.
but will name.yml be the value inside the field "name"?
https://www.elastic.co/guide/en/logstash/current/plugins-filters-translate.html No that is the full path to the file where you store your map.
Let's say you want to replace the short hostname of your machine with a full name.
shortname = 'philippMacBook'
fullname = 'philippkahrsFancyMacBookWithTouchBar'
translate{
field => "shortname"
destination => "fullname"
dictionary_path => "names.yml"
}
Your names.yml
would look like this
philippMacBook: "philippkahrsFancyMacBookWithTouchBar"
so in the names.yml you need to have the value of the field you are looking for stored as a key and the value you want to have in destination stored as a value.
I hope that helps
sorry I mean I want to use the value stored in the name field like a variable to look up the specific .yml file for the translation
I do not know to be honest. I think everything as a value to dictionary_path
is treated as a string and does not resolve variables.
Could you explain what you are trying to achieve with the translate filter?
I am trying to look up a number associated with a name but many names have the same number so I would need multiple different .yml files to match the correct names and numbers.. if that makes sense
Ok so from my understanding you have a single key (name) that has multiple values (numbers)?
You would still need to put them all into a single yaml or json with dictionaries.
It is possible to provide multi-valued dictionary values. When using a YAML or JSON dictionary, you can have the value as a hash (map) or an array datatype.
https://www.elastic.co/guide/en/logstash/current/plugins-filters-translate.html#plugins-filters-translate-dictionary
Let's say you have the following key values.
philippsMacBook:
- philipp
- macbook
- touchbar
- cat
your translate should look like this
translate{
field => "shortname"
destination => "[fullnames]"
dictionary_path => "names.yml"
}
since you are writing an array back. But you still need to combine all your yaml files into one.
i think i have not been very clear and that's my mistake let me try again
i have names of brands and each brand has multiple numbers associated with them ( part number) and each number is associated with a model but the problem is i have the same number used often for each of the brands.
so say i have fields brand and part_number and i was to translate the part number to the correct model based on the brand
translate {
field => "part_number"
destination => "model"
dictionary_path => %{brand}.yml
}
so say Apple was in the field brand it would use apple.yml in place of %{brand}.yml like a variable
again i do not know if this is possible i was hoping that i could use a variable
I understand your concept now. I do not think that this is possible, since the value of dictionary_path
will possible be passed directly, you could open a github issue on that one here https://github.com/logstash-plugins/logstash-filter-translate maybe they know more.
No, the value of dictionary_path is passed straight to IO.read, it is not sprintf'd first.
i see..
is it possible to use nested dictionaries with translate to accomplish what i want to do? for example:
apple:
12345: macbook
No not that I know.
the only thing you could do is something like this (pseudocode)
if(name == "Apple"){
translate{..... dictionary_path: "apple.yml"}
}else if (name == "Samsung"){
translate{.... dictionary_path: "samsung.yml"}
)
you would need to create a lot of translates and if queries.
yeah unfortunately I would potentially need to create 1000s
Then I would suggest opening an issue at the github repo I linked above.
If you're willing to transform your translate data a bit you could structure the file like:
Apple_12345: macbook
Apple_12346: iphone
Dell_12345: laptop
Then construct a new field to use for your translate:
translate {
add_field => { "lookup" => "%{brand}_%{part_number}" }
field => "lookup"
destination => "model"
dictionary_path => "translate_file.yml"
remove_field => [ "lookup" ]
}
thank you that is a good work around I will have to try it
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
© 2020. All Rights Reserved - Elasticsearch
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant logo are trademarks of the Apache Software Foundation in the United States and/or other countries.