无法使多行 rsyslog 语句将传入的 syslog 过滤到不同的文件
Posted
技术标签:
【中文标题】无法使多行 rsyslog 语句将传入的 syslog 过滤到不同的文件【英文标题】:Unable to make multi-line rsyslog statements filter incoming syslogs to different files 【发布时间】:2019-02-22 23:19:16 【问题描述】:我已经尝试了很多不同的方法。我有一个从代理服务器到端口 1522 的传入系统日志提要。我正在尝试匹配消息/正文“location =”的一部分并将每个日志从某个位置发送到它自己的文件。我已经在小范围内完成了此操作,但从未使用过长的多行代码。
系统日志示例:
Feb 22 22:59:51 192.168.0.126 |2019-02-22 22:58:20|reason=Allowed|event_id=6660962988918112262|protocol=HTTP|action=Allowed|transactionsize=8374|responsesize=6073|requestsize=2301|urlcategory=Internet Services|serverip=52.114.76.34|clienttranstime=125000|requestmethod=CONNECT|refererURL=None|useragent=Unknown|product=NSS|location=ABC Corporation|ClientIP=192.168.1.152|status=200|user=ABC Corporation|url=mobile.pipe.aria.microsoft.com|vendor=Zscaler|hostname=mobile.pipe.aria.microsoft.com|clientpublicIP=192.65.41.5|threatcategory=Clean Transaction|threatname=None|filetype=None|appname=Common Office 365 Applications|pagerisk=0|department=Default Department|urlsupercategory=Internet Communication|appclass=Business|dlpengine=None|urlclass=Business Use|threatclass=Clean Transaction|dlpdictionaries=None|fileclass=None|bwthrottle=NO|servertranstime=125000
我在 /etc/rsyslog.d/networks.conf 文件中尝试了以下变体,但没有一个匹配位置并指向不同的文件:
TAKE-1:
template(name="abc-zscaler-web" type="string" string="/var/rsyslog/zscaler-web/%FROMHOST%/abc-%$year%-%$month%-%$day%.log")
template(name="def-zscaler-web" type="string" string="/var/rsyslog/zscaler-web/%FROMHOST%/def-%$year%-%$month%-%$day%.log")
template(name="ghi-zscaler-web" type="string" string="/var/rsyslog/zscaler-web/%FROMHOST%/ghi-%$year%-%$month%-%$day%.log")
$RuleSet Remote1522
$RuleSet CreateMainQueue on
if $msg contains 'location=ABC ' then action(type="omfile" DynaFile="abc-zscaler-web") stop
if $msg contains 'location=DEF ' then action(type="omfile" DynaFile="def-zscaler-web") stop
if $msg contains 'location=GHI ' then action(type="omfile" DynaFile="ghi-zscaler-web") stop
*.* then action(type="omfile" DynaFile="abc-zscaler-web") stop
$InputTCPServerBindRuleset Remote1522
$InputTCPServerRun 1522
TAKE-2:
$RuleSet Remote1522
$RuleSet CreateMainQueue on
if $msg contains "location=ABC " then /var/rsyslog/zscaler-web/%FROMHOST%/abc-%$year%-%$month%-%$day%.log
if $msg contains "location=ABC " then stop
if $msg contains "location=DEF " then /var/rsyslog/zscaler-web/%FROMHOST%/def-%$year%-%$month%-%$day%.log
if $msg contains "location=DEF " then stop
if $msg contains "location=GHI " then /var/rsyslog/zscaler-web/%FROMHOST%/ghi-%$year%-%$month%-%$day%.log
if $msg contains "location=GHI " then stop
*.* /var/rsyslog/zscaler-web/%FROMHOST%/abc-%$year%-%$month%-%$day%.log
$InputTCPServerBindRuleset Remote1522
$InputTCPServerRun 1522
TAKE-3
$RuleSet Remote1522
$RuleSet CreateMainQueue on
if ( $msg contains 'location=ABC ') then
action(type="omfile" file="/var/rsyslog/zscaler-web/%FROMHOST%/abc-%$year%-%$month%-%$day%.log")
else if ($msg contains 'location=DEF ') then
action(type="omfile" file="/var/rsyslog/zscaler-web/%FROMHOST%/def-%$year%-%$month%-%$day%.log")
else if ($msg contains 'location=GHI ') then
action(type="omfile" file="/var/rsyslog/zscaler-web/%FROMHOST%/ghi-%$year%-%$month%-%$day%.log")
else action(type="omfile" file="/var/rsyslog/zscaler-web/%FROMHOST%/abc-%$year%-%$month%-%$day%.log")
$InputTCPServerBindRuleset Remote1522
$InputTCPServerRun 1522
TAKE-4(还有更多,但这是最后一个有意义的)
$template abc-zscaler-web,"/var/rsyslog/zscaler-web/%FROMHOST%/abc-%$year%-%$month%-%$day%.log"
$template def-zscaler-web,"/var/rsyslog/zscaler-web/%FROMHOST%/def-%$year%-%$month%-%$day%.log"
$template ghi-zscaler-web,"/var/rsyslog/zscaler-web/%FROMHOST%/ghi-%$year%-%$month%-%$day%.log"
$RuleSet Remote1522
$RuleSet CreateMainQueue on
if $msg contains 'location=ABC ' then -?abc-zscaler-web
if $msg contains 'location=ABC ' then stop
if $msg contains 'location=DEF ' then -?def-zscaler-web
if $msg contains 'location=DEF ' then stop
if $msg contains 'location=GHI ' then -?ghi-zscaler-web
if $msg contains 'location=GHI ' then stop
*.* -?abc-zscaler-web
$InputTCPServerBindRuleset Remote1522
$InputTCPServerRun 1522
我的 reiner 脚本中是否缺少某些内容。对代码/位置进行了消毒以保护无辜者。
【问题讨论】:
【参考方案1】:我不知道这是否只是您的副本中的一个错误,但是行
$RuleSet CreateMainQueue on
应该是
$RuleSetCreateMainQueue on
如果您要使用 rsyslogd -N1 -f server.conf
之类的内容测试服务器配置文件的语法,您会看到错误:
rsyslogd: error: extra characters in config line ignored: 'on'
最终结果是您定义了一个名为 CreateMainQueue 的规则集,而不是 Remote1522。
【讨论】:
以上是关于无法使多行 rsyslog 语句将传入的 syslog 过滤到不同的文件的主要内容,如果未能解决你的问题,请参考以下文章
无法使用准备好的对象语句从 mysql 获取多行数据 [重复]