Filtering by program name
From rsyslog wiki
Filtering by program name allows you for instance to segregate log messages by their originators (or maybe to silence a particularly verbose program)
Filtering by program name using the BSD selector syntax
This method doesn't fully work with current versions of rsyslogd. (Included here so you can avoid the trap!) While the BSD selector !programname works, its 'disabling' counterpart !* doesn't! (Noted here as 'NOT YET IMPLEMENTED': [1]). If you use !*, the filtering is not reset and nothing ever matches again until a new program filter is enabled.
If you happen to use this BSD syntax !programname / !* syntax in a rsyslog.d/*.conf file, the result is that you just disabled a the interesting part of the main rsyslog.conf without touching it.
Until it's fixed, you will have to use the 'expression based' syntax instead of the BSD syntax.
Filtering by program name using the expression-based syntax
This is how I filtered popa3d output so that everything higher than info ends up in /var/log/popa3d.log and doesn't appear anywhere else:
# First, I redirect everything that matches the program name 'popa3d' and of priority higher than info (6) into the log file I want
if $programname == 'popa3d' and $syslogseverity <= '6' then /var/log/popa3d.log
# Then I use the same redirect but with ~ as the action, causing the log line not to go into other filters
if $programname == 'popa3d' and $syslogseverity <= '6' then ~
NB: I did put those two lines in the file /etc/rsyslog.d/popa3d.conf, but they can be put in the main rsyslog.conf if you do not use the rsyslog.d method
# If the second part appears after the first filter, you can simply write:
& ~