I have a record which looks like this:

{"log":"{\"type\":\"response\",\"@timestamp\":\"2018-03-12T18:33:17Z\",\"tags\":[],\"pid\":66,\"method\":\"head\",\"statusCode\":200,\"req\":{\"url\":\"\/\",\"method\":\"head\",\"headers\":{\"user-agent\":\"curl\/7.29.0\",\"host\":\"localhost:5601\",\"accept\":\"*\/*\"},\"remoteAddress\":\"127.0.0.1\",\"userAgent\":\"127.0.0.1\"},\"res\":{\"statusCode\":200,\"responseTime\":1,\"contentLength\":9},\"message\":\"HEAD \/ 200 1ms - 9.0B\"}"

I use mmjsonparse to parse it.  I then want to parse the embedded json string in the "log" field.

If I use mmnormalize like this:

    action(type="mmnormalize" ruleBase="/etc/rsyslog.d/viaq/parse_json.rulebase" variable="$!log")

With a rule like this:

rule=:%payload:json%

I get a record which looks like this:

"payload":{"type":"response","@timestamp":"2018-03-12T18:33:17Z",....

so $!payload!type, $!payload!@timestamp, etc.

But what I want to have is type, @timestamp, etc. as top level fields e.g.

$!type, $!@timestamp, etc.

I have tried this:

    foreach ($.ii in $!payload) do {
        set $! = $.ii;
    }
    unset $!payload;

But that does not work.  I also tried `set $! = $!payload;` but that didn't work either.  What I really want is something like this:

    foreach ($.ii in $!payload) do {
        set $!{$.ii!key} = $.ii!value;
    }
    unset $!payload;

I can't just do

set $!type = $!payload!type; etc. etc.

because the contents of the payload may be different each time.

I think the new parse_json function might work but I'm stuck on rhel7 == rsyslog 8.24.


_______________________________________________
rsyslog mailing list
http://lists.adiscon.net/mailman/listinfo/rsyslog
http://www.rsyslog.com/professional-services/
What's up with rsyslog? Follow https://twitter.com/rgerhards
NOTE WELL: This is a PUBLIC mailing list, posts are ARCHIVED by a myriad of 
sites beyond our control. PLEASE UNSUBSCRIBE and DO NOT POST if you DON'T LIKE 
THAT.

Reply via email to