Rsyslog的模板template詳解

1、 Template功能

  • 根據用戶需求指定任意格式
  • 動態生成文件名
  • 每一個輸出都使用了一些模板,包括針對文件的,針對用戶消息等

備註:正則表達式

  • 舊版本:$template
  • 新版本:template()

V6以前是舊格式sql

V7版本,傳統語法與最新配置可在配置文件中混合使用,咱們下面學習的是新格式。mongodb

2、Template()聲明

1.做用

用來定義模板,是一種靜態聲明,表示全部的模板都會在rsyslog讀取配置文件的時候被定義。template不會受到if語句或嵌入配置的影響。shell

2.基本聲明結構

template(parameters)

list templates則是一種擴展的支持   template(parameters) {list-descriptions}

3.template的類型

類型參數指定不一樣的template類型,不一樣類型就可使用不一樣的方法來定義template的內容,類型不會影響插件工做,合適的template類型會很好的匹配需求。數據庫

  • List
  • Subtree
  • String
  • Plugin

下面具體講一下每種類型express

3、四種類型的學習

1. list類型json

List template是由一系列反覆出現的內容和變量語句生成的,內容經過「{}」包含起來,這種類型通常用於已知輸出結構的狀況,好比,ommongodb。建議在有複雜屬性替換的狀況下使用這種類型,比較清晰安全

List template包含template頭部(type = "list")和緊接着的用」{}」括起來的constant和property部分。服務器

  • constant:不變的,對反覆出現的文本進行描述
  • property:描述屬性。對於property有多種可用的選項,大多數選項被用來提取部分的屬性內容或者用來修改文本(好比將大寫字母轉換爲小寫字母)

舉例:性能

template(name="tpl1" type="list"){
constant(value="Syslog MSG is: '")

property(name="msg")

constant(value="', ")

property(name="timereported" dataFormat="rfc3339" caseConversion="lower")

constant(value="\n")

}

備註:這個示例可能會被用於定位常見的文件輸出

(1)常量的聲明(constant statement)

一種指定常量文本的方法。常量主要用於基於文本的輸出。

 

舉例:

template(name="outfmt" type="list"){

    property(name="$!user!msgnum")

    constant(value+"\n")

    }

下面是常量文本中可被識別的一系列轉義字符的含義: 

\

單個反斜線

\n

換行(line feed)

\000

三位八進制數-數字值對應的字符(\101表明字母A),三個數是必須的,可是建議使用十六進制

\xhh

十六進制數-表示數字值對應的字符(\x41表明A),注意兩個數都是必須給定的

若是反斜線後面跟了一個不支持的字符,那麼將會被當作一個威脅報錯,這種狀況會致使不可知的動做

爲結構化輸出建立name/value樹的時候,沒有outname參數的常量(constant text)會被忽略掉。

template(name="outfmt" type="list"){

property(name="$!usr!msgnum")

constant(value="\n" outname="IWantThisInMyDB")

}

常量聲明時可以使用如下參數            

value

常量的值

outname

結構化輸出中的字段名

(2)property的聲明

property聲明用於包含屬性文本,能夠用於全部的屬性。選項options用來指定提取或修改屬性的某些部分,對於property支持如下參數:                         

name

要訪問的屬性名

outname

結構化輸出中的字段名

dateformat

用於指定日期相關屬性的日期格式

caseconversion

將文本字母轉換成大寫或小寫,支持的value有「lower」和「upper」

controlcharacters

指定如何處理控制字符,value:轉義字符(escape),空格(用一個空格替換),從字符串中移除(drop)

securepath

在dynafile templates中用來建立pathnames

format

指定字段格式。csv(csv),json(沒有字段頭field header的json格式),jsonf(完整的json段),jsonr(沒有雙反斜線,可是可將其做爲安全的json字段),jsonfr(jsonf和jsonr的結合格式)

position.from

從這個位置開始包含子字符串(1是第一個位置)

position.to

一直到這個位置開始包含子字符串

position.relativetoend

From和to的位置與字符串的結尾有關

field.number

包含此字段的匹配

field.delimiter

字段提取的分隔符的十進制值

regex.expression

使用的正則表達式

regex.type

要麼ERE,要麼BRE

regex.nomatchmode

若是沒有匹配該怎麼作

regex.match

所使用的匹配

regex.submatch

所使用的子匹配

droplastLf

若是有一串換行符(LF)則丟棄

mandatory

表示字段的強制性,若是設置爲」on」,那麼就算爲空,這個字段也會在結構化輸出的時候一直存在。若是設置爲」off」(默認值),那麼當爲空得時候,這個字段就不會傳給結構化輸出。這個選項在支持動態結構的輸出中頗有用(好比ommongodb)

spifno1stsp

用於處理RFC3164 template的專用選項

 

2.子樹(subtree)

(1)概念

  從rsyslog 7.1.4開始啓用的內容。subtree主要用來生成基於完整(CEE)subtree的template。這種模板主要用於知道如何處理層級結構的輸出,好比ommongodb,對於這種類型,參數subtree必須被指定以告知要使用哪一個subtree。例如template(name="tpl1" type="subtree" subtree="$1")表示包含全部CEE數據,而template(name="tpl2" type="subtree" subtree="$!usr!tpl2")則只包含以"$!usr!tpl2"開頭的subtree。使用這種模板的核心理念是,真實地數據是經過set和unset腳本語句預生成的,同時結果的結構會再模板內部被使用。若是一個完整的subtree須要被直接放到對象的根部(object’s root),則必須使用這種類型。相對於其餘全部的模板類型,只有subcontainers可以被生成。注意subtree類型一樣能夠用於基本文本的輸出,如omfile。不過,這種狀況下,你是沒法指定常量的,所以就沒法包含換行符。由此,對於文本輸出使用subtree一樣被用於作調試或者一些特殊的場合(好比文本將會被JSON解釋器所解析)

(2)用例

subtree的典型用例:先建立一個自定義的subtree而後再template中使用,好比:

set $!usr!tpl2!msg = $msg;

set $!usr!tpl2!dataflow = fied($msg, 58, 2);

template(name="tpl2" type="subtree" subtree="$!usr!tpl2")

 

這裏,咱們假設$msg包含不一樣的字段,來自某字段的數據將會被提取出來並存儲用以與message一塊兒做爲字段的內容

3.字符串(string

包含一個強制的參數string,用來包含要使用的模板字符串,模板字符串是常量和replacement變量的混合字符串。這種變量來自於message或者當最後的字符串到達插件時候生成的動態內容。基於字符串的模板是制定文本內容的一種很好的方法,特別是當對於屬性沒有複雜操做的狀況下,特別適用。

template(name="tpl3" type="string"

string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"

) 

上例中,百分號之間的文本將會被rsyslog的property replacer所解釋。在nutshell中,它包含了將要使用的屬性以及格式化所需的選項和其餘處理,這與list模板中的property對象的功能相似(實際上僅僅是使用不一樣的語言來描述一樣地事情)

全部百分號外的內容都是常量,這上例中,在屬性值中間主要含有一些空格,在字符串的最後,使用了一個轉義字符。

轉義字符容許指定那些沒法打印的字符,這與C以及其餘語言中得轉義字符類似,他們是以一個反斜線引出並在其後跟上一個或多個字符來表示特定的字符,好比「\7」在US-ASCII中表明BEL(響鈴),「\n」表明新行。總之與C和perl語言支持的類似,但會有一些限制

 

4. 插件(plugin

使用plugin類型的時候,模板是由一個插件(或者被稱爲」strgen」或者」string generator」)來生成。它的格式是固定的,就像他被編碼時候同樣。然而這種類型並不靈活,因爲它提供了很高的性能(並非說其餘類型的模板很緩慢,而是指在那些對實時性要求很高的環境中),因此會被使用。在這種類型中,plugin參數必須被指定,而且要包含插件名用來識別它。注意在模板中,插件必需要被實現加載好,例如:

template(name="tpl4" type="plugin" plugin="mystrgen")

 

5、選項(options)

選項是可選的,注意不要混淆模板的選項和屬性的選項-屬性選項會被屬性替換器(property replacer)處理並用於單個屬性而非整個模板。模板選項是大小寫敏感的,目前模板屬性有:

  • option.sql - 用於爲MySQL將字符串格式化爲SQL語句,其中的單引號(’)和反斜線()會被對應的轉義字符替換(即「\’」和「\」)。注意在MySQL配置中,必須禁用NO_BACKSLASH_ESCAPES模式(默認就是禁用的)
  • option.stdsql - 將字符串格式化爲SQL語句以發送給表在哪混的sql服務器。這種方式會將字段中的單引號(‘)用兩個單引號來替換(’‘),若是MySQL配置文件中NO_BACKSLASH_ESCAPES設置爲on那麼就必須使用這個stdsql選項
  • option.json - 將字符串格式化爲JSON形式,這種方式會講字段中的單引號(‘)用兩個單引號(’‘)來替換。

無論何時,絕對不要同時使用多個模板選項,由於會引發未知的故障和邏輯錯誤

當模板是用以寫入數據庫的時候,則必須指定要麼爲sql選項要麼爲stdsql選項,不然有可能出現SQL注入的問題。須要注意的是,因爲在現實狀況,有的廠商並不遵照標準的sql規則而引入本身的轉義方法,因此一種選項並不能知足全部的工做,所以你必須確保你使用的是正確地格式。若是格式錯誤,仍然有可能遭遇sql注入的威脅。數據庫寫入程序會檢查模板中存在的SQL選項,若是不存在,那麼數據庫寫入操做就會被禁用,這也主要是爲了防止因爲你忘記配置sql選項而致使的SQL注入問題。SQL選項對於文件也頗有用,特別是在出於性能考慮,你想要將文件導出到另一臺機器的數據庫中得狀況。對於其餘的狀況,若是沒有特別須要,建議不要使用,由於這會帶來一些處理時間上的開銷,雖然很少,可是對於某些在這方面敏感的系統來講,這就顯得尤其重要了。對於寫入數據庫動做來講,默認狀況下使用的是sql選項,因爲當前咱們只支持MySQL而且sql選項也兼容了MySQL默認的配置,因此這就是個最佳選擇了。固然若是你將NO_BACKSLASH_ESCAPES設置爲on的話,則就須要使用stdsql選項以免SQL注意的威脅。

6、備註(附加)

1.爲omfile建立動態文件名

template(name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log")

2.傳統格式

傳統語法格式以下:

$template name,param[,options] 

name:模板名

param:指定模板內容的參數

options:設置模板選項

3.預留的模板名

  • 以」RSYSLOG_」開頭的模板名是位rsyslog預留使用的,自定義的模板不要使用這些名字,不然有可能產生衝突致使未知故障。下面就是一直預留共使用的系統模板
  • RSYSLOG_TraditionalFileFormat - 傳統風格的使用不怎麼精確的時間戳的默認日誌文件格式
  • RSYSLOG_FileFormat - 「現代風格」的日誌文件格式,與TraditionalFileFormat相似,可是使用的是更高精度的時間戳和時區信息
  • RSYSLOG_TraditionalForwardFormat - 傳統風格的轉發格式,時間戳精度低,一般用於將日誌消息轉發給其餘的syslogd或者低於3.12.5版本的rsyslogd
  • RSYSLOG_SysklogdFileFormat - sysklogd兼容的日誌格式。若是使用選項$SpaceLFOnReceive on,$EscapeControlCharactersOnReceive off和$DropTrailingLFOnReception off,那麼日誌格式就會聽從sysklogd的日誌格式
  • RSYSLOG_ForwardFormat - 相似傳統的風格,可是有更高精度的時間戳和時區信息。建議在將日誌消息轉發給3.12.5或更高的rsyslog版本的時候使用
  • RSYSLOG_SyslogProtocol23Format - 在IETF的internet-draft ietf-syslog-protocol-23中指定的格式,可能會成爲新的RFC日誌標準格式。這種格式加入了一些改進。rsyslog的消息分析程序(message parser)能夠讀懂這種格式,因此它能夠在最近版本的rsyslog中使用,對於不支持的syslog版本可能會直接拒絕這種格式,因此使用以前最好檢查一下。【注】在最終的RFC標準出臺的時候,格式可能不會發生改變,但也有可能會發生一些變化
  • RSYSLOG_DebugFormat - 一種特殊的用於調試property故障的格式,不要在生產環境或者遠程轉發的狀況下使用這種格式
相關文章
相關標籤/搜索