无法使多行 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 过滤到不同的文件的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 连接表,使多行变成一行

Rsyslog初步学习

无法使用准备好的对象语句从 mysql 获取多行数据 [重复]

Visual Studio 2015 缩进多行 for 语句

SQL 语句 如何把多行数据放入一行显示 比如:

更新语句中的“单行子查询返回多行”