rsyslog 遠端日誌的條件轉發
我有一個 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
我承認我不完全理解你的意圖。不過,我可能有一個解決方案。
首先,“Dec”、“Jan”……當且僅當它是傳統的 RFC3164 syslog 時,通常會回到 syslog 標頭。對於較新的系統,您沒有該指示。此外,許多系統違反 syslog 標準,您也可能在消息中找不到這些字元串。
假設它們存在,並進一步假設它們在 syslog 標頭中:那麼它們不是 $ msg or $ 來自主機。為了使它順利和容易,您可以簡單地檢查 $rawmsg,這是在網路上看到的消息。這是未解析的形式,處理此類事情的方式較差,但好處是它可以在不理解完整理論的情況下工作。
所以你可以說:
$template mynets,"/scratch/network/%HOSTNAME%/messages.log" if $rawmsg contains 'Dec ' then -?mynets & stop
請注意,我在“Dec”之後至少添加了一個空格,否則它將匹配包含該字元串的任何內容(例如“Decimal”)。
這可能有效,但這取決於您不應該認為理所當然的許多事情。一個更好的方法是檢查 $fromhost-ip 是否與本地主機不同。或者,更好的是,為遠端日誌創建專用規則集。但這不取決於最初的問題,所以讓我們把它排除在外。