rsyslog 嵌套规则

rsyslog 嵌套规则

我目前有一个 rsyslog 规则来拆分所有日志记录史努比为每个用户创建一个文件

~$ cat /etc/rsyslog.d/10-snoopy.conf
$template DYNsnoopy,"/var/log/snoopy/uid.%msg:R,ERE,1,BLANK:uid:([0-9]*)--end%.log"
:programname, isequal, "snoopy" ?DYNsnoopy
& ~

示例输出:

~$ tail /var/log/snoopy/uid.1000.log
Feb 13 10:17:38 box snoopy[32108]: [uid:1000 sid:2781 tty: cwd:/home/user filename:/usr/bin/cut]: cut -d   -f 1-3 /proc/loadavg 
Feb 13 10:17:57 box snoopy[32158]: [uid:1000 sid:27176 tty:/dev/pts/2 cwd:/home/user filename:/usr/bin/colortail]: colortail /var/log/snoopy/uid.1000.log 

我想改变规则,这样如果命令在终端上运行,它就会进入它自己的文件 - 这样我就可以保留我执行过的命令的完整历史记录,并轮换由 cron 等运行的命令。

但是我不确定与嵌套 if 语句相关的语法,或者是否可以做到这一点。

if $programname == 'snoopy' then
  $template DYNsnoopy,"/var/log/snoopy/uid.%msg:R,ERE,1,BLANK:uid:([0-9]*)--end%.log"

  # if msg contains tty:/dev/pts/2 write to tty.log, else write to uid.xxx.log
  if $msg ereregex "tty:([A-z0-9/]*) cwd" then /var/log/snoopy/tty.log
  *.* ?DYNsnoopy
  & ~

答案1

虽然不是 100% 满意,但这只会将在 tty 上捕获的消息记录到 snoopy 日志目录中

$template DYNsnoopy,"/var/log/snoopy/uid.%msg:R,ERE,1,BLANK:uid:([0-9]*)--end%.log"
if $programname == 'snoopy' and not ($msg contains 'tty: cwd') then -?DYNsnoopy                                                                                                                    
& ~

相关内容