我有一个 rsyslog 服务器,它具有以下设置,它获取所有远程 Linux 系统日志和网络日志。
# cat /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template noida-dc, "/scratch/rsyslog/%HOSTNAME%/messages.log"
authpriv.* ?noida-dc
*.info,mail.none,authpriv.none,cron.none ?noida-dc
$IncludeConfig /etc/rsyslog.d/*.conf
Linux 系统日志是/scratch/rsyslog
通过使用主机名本身创建一个目录,然后在其中创建一个消息文件来存储主机名的日志,这很好。
但是,我想隔离网络日志,它基本上按月份名称创建一个文件夹 Jan Feb Mar
,然后创建一个message.log
文件夹,但由于网络日志没有主机名,因此只需根据飞蛾名称创建一个目录并将唯一的一个文件保留在其中就是这样messages.log
,我的愿望是将这些网络日志保存到不同的目录,例如/scratch/network
.
以下是网络日志目录中的消息格式Dec
Dec 2 19:04:22 Dec 02 13:34:22.768 cisco-apic-1 %LOG_-3-SYSTEM_MSG
那么,有没有办法告诉 rsyslog 远程消息是否包含Dec
或Jan
必须转到/scratch/network
.
我尝试如下但不起作用。
$template mynets,"/scratch/network/%HOSTNAME%/messages.log"
if $fromhost contains 'cisco-apic-1' then -?mynets
& stop
&
$template mynets,"/scratch/network/%HOSTNAME%/messages.log"
if $fromhost startswith 'Dec' then -?mynets
& stop
Linux 发行版是:Centos 6
答案1
我承认我不完全理解你的意图。尽管如此,我可能有一个解决方案。
首先,当且仅当它是传统的 RFC3164 syslog 时,“Dec”、“Jan”等通常会返回到 syslog 标头。对于较新的系统,您没有该指示。此外,许多系统违反了系统日志标准,您也可能在消息中找不到这些字符串。
假设它们存在,并进一步假设它们位于 syslog 标头中:那么它们不是 $msg 或 $fromhost 的一部分。为了使其顺利和简单,您可以简单地检查 $rawmsg,这是在网络上看到的消息。这是未解析的形式,处理此类事情的方式较差,但好处是它无需理解完整的理论即可工作。
所以你可以说:
$template mynets,"/scratch/network/%HOSTNAME%/messages.log"
if $rawmsg contains 'Dec ' then -?mynets
& stop
请注意,我在“Dec”之后至少添加了一个空格,因为否则它将匹配包含该字符串的任何内容(例如“Decimal”)。
这可能有效,但它取决于许多你不应该认为是理所当然的事情。更好的方法是检查 $fromhost-ip 是否与本地主机不同。或者,更好的是,为远程日志创建专用规则集。但这不符合最初的问题,所以让我们忽略它。