Oh, just recalled you mentioned documentation of array-subscripting.
Im unsure where to put it.

I am not sure if I documented it at all at the time of implementing
it, because I just didn't know where to put it.

Suggestions?

On Sat, May 23, 2015 at 12:13 AM, singh.janmejay
<[email protected]> wrote:
> Actually for contains, I was thinking of function rather than keyword.
>
> I was proposing we leave the already supported keyword alone, but
> don't add anymore, and develop more things in the form of functions as
> opposed to keywords, so that it doesn't complicate the language too
> much (Im thinking from the pov of a new person trying to learn this,
> we can make stdlib very large, no one really worries about it, but if
> we have too many keywords, it's going to scare people away). I know
> stdlib is a little bit of a stretch, but closest analogy that comes to
> my mind right now.
>
> So I meant 'contains' the function, not the keyword.
>
> Or may be we can use has(array, elem) or include(array, elem) or
> hasItem(array, elem) etc to avoid confusing people by having similarly
> named keyword and function.
>
> Thoughts?
>
> On Sat, May 23, 2015 at 12:04 AM, singh.janmejay
> <[email protected]> wrote:
>> Ok, we'll have to get into a little bit of code here, I know no better
>> way to explain why it doesn't work for you, my apologies.
>>
>> This is the form that the array that you built is loaded to:
>> https://github.com/rsyslog/rsyslog/blob/master/grammar/grammar.y#L215
>>
>> We actually convert cnfarray to first element of that array for
>> expr-evaluation:
>> https://github.com/rsyslog/rsyslog/blob/master/grammar/rainerscript.c#L2314
>>
>> Beyond this, all code assumes no cnfarray:
>> https://github.com/rsyslog/rsyslog/blob/master/runtime/msg.c#L4558
>>
>> So cnfarray was actually meant for a different purpose, I haven't yet
>> dug into what that purpose is (@Rainer/David help?).
>>
>> But its definitely not equal to json-array, which is why your loop doesn't 
>> work.
>>
>> So in order to loop, you need a json array, which generally comes from
>> mmjsonparse or mmnormalize generated object-graph.
>>
>> Take a look at the test in the PR I linked-to in this thread. That
>> actually loops over an array and decides if it should stop processing
>> a message depending on presence of a certain value in an array. That
>> should serve as a working example of how to use foreach, except you'll
>> probably have something useful in place of stop.
>>
>>
>> On Fri, May 22, 2015 at 11:12 PM, David Lang <[email protected]> wrote:
>>> On Fri, 22 May 2015, David Boles (dboles) wrote:
>>>
>>>> Yes, it is a string. Taking your clarification that foreach operates on
>>>> arrays, I've tried the config below. When I push a log message from an
>>>> application I observe:
>>>>
>>>>    - The action with the msg1 template occurs
>>>>    - The action with the msg2 template does not occur
>>>>    - The action with the msg3 template occurs
>>>>
>>>> What should be changed below to cause the loop to be traversed?
>>>>
>>>> Thanks,
>>>>
>>>> David Boles
>>>>
>>>> --------
>>>> module(load="imuxsock")  # local system logging support
>>>> module(load="imkmsg")    # structured kernel logging support
>>>>
>>>> module(load="mmjsonparse")
>>>>
>>>> template(name="msg1" type="list") { constant(value="pre-foreach record\n")
>>>> }
>>>> template(name="msg2" type="list") { constant(value="   foreach record\n")
>>>> }
>>>> template(name="msg3" type="list") { constant(value="post-foreach
>>>> record\n") }
>>>>
>>>> if ($fromhost-ip == '127.0.0.1' and $syslogfacility-text != 'kern') then {
>>>>    action(type="mmjsonparse")
>>>>    if $parsesuccess == "OK" then {
>>>>
>>>>        action(type="omfile" template="msg1"
>>>>               file="/var/log/db_local_user_structured.log")
>>>>
>>>>        set $.myarray = [ "0", "1", "2", "3", "4", "5" ];
>>>>        set $.index = 0;
>>>
>>>
>>> there is no need for $.index = 0; it's not a counter, it just gets assigned
>>> to each of the contents of myarray
>>>
>>>>        foreach ($.index in $.myarray) do {
>>>>            action(type="omfile" template="msg2"
>>>>                   file="/var/log/db_local_user_structured.log")
>>>>        }
>>>
>>>
>>> this action should happen 6 times as I understand it.
>>>
>>>>        action(type="omfile" template="msg3"
>>>>               file="/var/log/db_local_user_structured.log")
>>>>    }
>>>> }
>>>> --------
>>>
>>>
>>> having multiple action writing to the same file can result in some
>>> interesting issues (at least conceptually, I'll let Rainer speak up if they
>>> have been solved in practice)
>>>
>>> what I would do is
>>>
>>> $template custom,"%$.custom%"
>>>
>>> ruleset(name="db_local_user_structured"){
>>>   action(type="omfile" template="custom"
>>> file="/var/log/db_local_user_structured.log")
>>> }
>>>
>>> and then replace each of the actions in your example with
>>>
>>> set $.custom = "message";
>>> call custom
>>>
>>> David Lang
>>>
>>>
>>>>
>>>>
>>>>
>>>> -----Original Message-----
>>>> From: [email protected]
>>>> [mailto:[email protected]] On Behalf Of singh.janmejay
>>>> Sent: Thursday, May 21, 2015 10:43 AM
>>>> To: rsyslog-users
>>>> Subject: Re: [rsyslog] Unable to use foreach
>>>>
>>>> I think $!mse.element_indices is a string, right?
>>>>
>>>> If its a string, you'll need to parse it to make it an array before you
>>>> can loop on it. Foreach works only with arrays. It can be array or anything
>>>> (string, object, numbers whatever), but it has to be an array.
>>>>
>>>> You can use tokenized field-type to parse it and since you are already
>>>> using mmjsonparse it shouldn't be a problem.
>>>>
>>>> On Thu, May 21, 2015 at 8:47 PM, David Boles (dboles) <[email protected]>
>>>> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> I am using rsyslog (v8.9) to process structured log data from umberlog
>>>>> and Linux's printk_emit. In the log message is a field
>>>>> "$!mse.element_indices" that can have values such as "0", "0 1", "0 1 2",
>>>>> and so on. I would like to iterate over the delimited elements of that 
>>>>> value
>>>>> and had supposed that foreach would do something like that.
>>>>>
>>>>> With the config below I comment/uncomment the foreach loop. When the
>>>>> foreach loop is commented out rsyslog creates entries in both mongodb and
>>>>> the file. When the foreach loop is uncommented, rsyslog produces nothing 
>>>>> in
>>>>> either destination.
>>>>>
>>>>> Why does this use of foreach fail? What should I be doing to iterate?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> David Boles
>>>>>
>>>>> ----------------------------------------------------------------------
>>>>> --------
>>>>>
>>>>> module(load="imuxsock")
>>>>> module(load="imkmsg")
>>>>> module(load="imtcp")
>>>>> input(type="imtcp" port="10514")
>>>>> module(load="mmjsonparse")
>>>>> module(load="ommongodb")
>>>>>
>>>>> kern.* /var/log/db_kernel.log
>>>>> *.* /var/log/db_full.log
>>>>>
>>>>> template(name="mse-structured-info" type="subtree" subtree="$!")
>>>>>
>>>>> template(name="mse-all-info" type="list") {
>>>>>     property(name="jsonmesg" outname="msg") }
>>>>>
>>>>> if ($fromhost-ip == '127.0.0.1' and $syslogfacility-text != 'kern') then
>>>>> {
>>>>>     action(type="mmjsonparse")
>>>>>     if $parsesuccess == "OK" then {
>>>>>         set $!foo = $!mse.element_indices;
>>>>>
>>>>>         set $!amph = "toad";
>>>>> #       foreach ($.index in $!mse.element_indices) do {
>>>>> #           set $!amph = "turtle";
>>>>> #       }
>>>>>         action(type="ommongodb" server="somemachine.somewhere.org"
>>>>>                db="logs" collection="syslog"
>>>>> template="mse-structured-info")
>>>>>
>>>>>         action(type="omfile" template="mse-all-info"
>>>>>             file="/var/log/db_local_user_structured.log")
>>>>>     }
>>>>> }
>>>>>
>>>>> $WorkDirectory /var/spool/rsyslog
>>>>>
>>>>> _______________________________________________
>>>>> 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.
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Regards,
>>>> Janmejay
>>>> http://codehunk.wordpress.com
>>>> _______________________________________________
>>>> 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.
>>>> _______________________________________________
>>>> 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.
>>>>
>>> _______________________________________________
>>> 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.
>>
>>
>>
>> --
>> Regards,
>> Janmejay
>> http://codehunk.wordpress.com
>
>
>
> --
> Regards,
> Janmejay
> http://codehunk.wordpress.com



-- 
Regards,
Janmejay
http://codehunk.wordpress.com
_______________________________________________
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