I tried to stay away from making the config script language a full
programming language.  If we now think it needs to be, I won't object but
we should be sure there is good reason to do so and not just feature creep.
..

Sent from phone, thus brief.
Am 22.05.2015 21:48 schrieb "singh.janmejay" <[email protected]>:

> Cool, will add doc soon.
>
> I see what you are saying about functions, but keywords make the
> language's core harder to grasp, which affects language's learning
> curve. Functions are very different, because every-time a user
> encounters one, they know its just another procedure/function which
> will do something or return something. To be able to use keywords
> effectively, one needs to know very well where they fit in the
> language's constructs. For functions, they already know that.
>
> But I do see the point you are making about arg order.
>
> How about this: In addition to current function-calling-style, we
> support python or R like calling style too, so people can optionally
> mention argument names?
>
> Another option is to use object-oriented style:
> $.array.includes("foo") etc. We can make this work similar to how
> python or c++ do, first argument is assumed to variable(in our case
> expression) the function is dispatched upon. It'll not solve all
> problems, but it'll do a brilliant job of disambiguating 2-arg
> functions, while keeping language core lean.
>
>
> On Sat, May 23, 2015 at 1:06 AM, David Lang <[email protected]> wrote:
> > On Sat, 23 May 2015, singh.janmejay wrote:
> >
> >> 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?
> >
> >
> > I would put it in two places.
> >
> > 1. in the section that talks about variables
> >
> > 2. as an example in the section that talks about tests
> >
> > David Lang
> >
> >
> >> 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
> >>
> >>
> >>
> >>
> >>
> > _______________________________________________
> > 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.

Reply via email to