I have multiple application environments on one host, and need to identify the environment based on the directory path in the source log file.
Using a regex in the search works fine, like so
sourcetype="gfstats" | rex field=source "[\w\W/]+/gf-(?<env>[^\.]+)\.log" | search env="app1"
But I would like to define the environment as a field I can use in other searches.
I added a line to props.conf:
EXTRACT-sourcefields = (?<logdir>[\w\W/]+)/gf-(?<environment>[^\.]+)\.log in source
But although I can now see the content of the environment field when I perform searches, I cannot use that field in searches.
returns no results. Why?
We do practically the same thing for some of our apps. For this to work via props.conf / transforms.conf you have to set up "environment" as an indexed field.
(props.conf) [mysourcetype] TRANSFORMS-env=environment (transforms.conf) [environment] SOURCE_KEY=MetaData:Source REGEX=/path/to/app/([^/]+)/log/.*\.log FORMAT=environment::$1 WRITE_META=true
This works, but all of the usual caveats related to indexed fields apply. Something just as good might be achievable with eventtypes, but I've not tried it to see.
The reason this happens is that a query for
fname="val" on an search-time extracted field
fname is internally converted to a search for
("val" AND fname="val") which first searches only for events containing the token
val in the raw data. Unfortunately, your extracted field is not in the raw data, so the desired events don't come back.