我目前有一个 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
& ~