[systemd-devel] [PATCH V2] journalctl: fix logic with parameter "-u"

Harald Hoyer harald.hoyer at gmail.com
Fri Mar 22 22:09:03 PDT 2013


Am 23.03.2013 01:39, schrieb Lennart Poettering:
> On Fri, 22.03.13 15:51, harald at redhat.com (harald at redhat.com) wrote:
> 
>> From: Harald Hoyer <harald at redhat.com>
>>
>> When using "-p" and "-b" in combination with "-u", the output is not
>> what you would expect. The reason is the sd_journal_add_disjunction()
>> call in add_matches_for_unit() and add_matches_for_user_unit(), which
>> adds two ORs without taking the other conditions to every OR.
> 
> Hmm, the current code that filters for units/coredumps is certainly
> broken, but I fear that it's not the right solution...
> 
> The logic behind the matches would allow for expressions of any depth,
> however, our API doesn't open this up, and only allows disjunctions of
> conjunctions of very specific disjunctions. (i.e. an OR expression of
> AND expressions of very specific OR expressions). It did this because I
> wanted the API to be as simple as possible, and I didn't want to create
> an API that was complex enough to build arbitrary boolean expressions.
> 
> To me it appears as if we should expose a fourth level on top, of AND
> expressions, and should by this then expose a sufficiently capable
> language that is good enough to do the unit matching.
> 
> Example, currently:
> 
>  "FOO=BAR + BAR=FOO WALDO=QUUX WALDO=QIIX"
> 
> will be resolved in three levels:
> 
>  Level 0 OR:   ("FOO=BAR" OR "BAR=FOO WALDO=QUUX WALDO=QIIX")
>  Level 1 AND:  ("FOO=BAR" OR ("BAR=FOO" AND "WALDO=QUUX WALDO=QIIX"))
>  Level 2 OR:   ("FOO=BAR" OR ("BAR=FOO" AND ("WALDO=QUUX" OR "WALDO=QIIX")))
> 
> And maybe we should beef this up with a level -1 implementing an AND.
> For example, we could introduce the highest level with a parsing character such as @:
> 
>  "FOO=BAR + BAR=FOO WALDO=QUUX WALDO=QIIX @ MIAU=KIKIRIKI"
> 
> which would be resolved in four levels:
> 
>  Level 0 AND: (("FOO=BAR + BAR=FOO WALDO=QUUX WALDO=QIIX") AND ("MIAU=KIKIRIKI"))
>  Level 1 OR:  (("FOO=BAR" OR "BAR=FOO WALDO=QUUX WALDO=QIIX") AND ("MIAU=KIKIRIKI"))
>  Level 2 AND: (("FOO=BAR" OR ("BAR=FOO" AND "WALDO=QUUX WALDO=QIIX")) AND ("MIAU=KIKIRIKI"))
>  Level 3 OR:  (("FOO=BAR" OR ("BAR=FOO" AND ("WALDO=QUUX" OR "WALDO=QIIX"))) AND ("MIAU=KIKIRIKI"))
> 
> Does this make sense?
> 
> On the API side we'd need an additional sd_journal_add_conjunction()
> call. And sd_journal_add_match() and sd_journal_add_disjunction() need
> to be updated to deal with the deeper hierarchy.
> 
> Lennart
> 

Sure, I just didn't want to get into implementing sd_journal_add_conjunction() :-)


More information about the systemd-devel mailing list