我正在尝试使用 bash 脚本使用 rsyslog 解析audit.log,以便将 proctitle 的十六进制部分转换为 ascii。但是我没有得到结果:文件audit_ascii.log 没有带有“proctitle”值的行。我测试了该脚本,它工作正常,所以我猜问题来自我的 rsyslog.conf。
rsyslog.conf:
$InputFileName /var/log/audit/audit.log
$InputFileTag tag_auditd:
$InputFileStateFile log_audit
$InputFileSeverity info
$InputFileFacility local6
$InputRunFileMonitor
if $msg contains "msg=audit" then {
action(type="omprog" binary="/bin/bash /opt/bin/hex2ascii.sh" output="/var/log/audit/audit_ascii.log")
十六进制2ascii
#!/bin/bash
read log
hasHex=$(echo $log | egrep "msg=audit" | egrep "type=PROCTITLE" | egrep -v '"' | wc -c)
if [ ${hasHex} -gt 0 ];
then
part1=$(echo $log | cut -d"=" -f1-3)
part2=$(echo $log | cut -d"=" -f4)
part2=$(echo $part2 | xxd -r -p )
echo $part1 >> /var/log/audit/verif.txt
#echo "${part1}=${part2}\n" >> /var/log/audit/audit_ascii.log
log="${part1}=${part2}\n"
#else
#echo $log >> /var/log/audit/audit_ascii.log
fi
答案1
尽管 rsyslog 内置了多个模块,但其中一些模块不是内置的,需要先加载才能使用。
您正在使用的模块imfile
前面需要添加以下行(采用旧语法):
$ModLoad imfile
同样,奥普罗格模块,如果使用较新的语法,需要
module(load="omprog")
在它可以在语句中使用之前if
(缺少结束语}
)。查看您将从中获得的错误消息rsyslogd -N 1
。
答案2
只需在脚本将更改的日志重定向到另一个文件后停止流程即可。然后我将新文件作为 rsyslog 中的另一个输入。我找到的最佳解决方案