解析配置文件
結構體定義
在UASG中定義了LogSegInfo
結構體保存配置文件中用戶對每一個字段的配置信息寨典,從而實現(xiàn)配置文件的解析厨诸。每一個結構體對應一個話單字段弯屈,LogSegInfo結構體數(shù)組就對應了一個完整的話單格式济丘。
typedef struct LogSegInfo_s
{
short nCondxDRType[XDRLOG_TYPE_MAX]; //保存COND指定的XDR類型
int nMaxLen; //字段最大長度限制
int (*pSegFormatFunc)(char *pBuffer, LogSegInfo_s *pLogSegInfo, LogInfo_t *pLogInfo); //根據(jù)函數(shù)名進行匹配的函數(shù)指針
unsigned char cIndexCount; //一共有多少個序號(組合字段含有多于一個字段序號)
unsigned char aFormatIndex[MAX_COUNT_IN_SECTION]; //格式化的序號
char aFormatStr[MAX_FORMAT_LEN]; //進行格式化的目標字符串
int nFormatStrLen; //目標字符串長度
char aDefaultStr[MAX_DEFAULT_LEN]; //默認字符串
int nDefaultStrLen; // 默認字符串長度
TargetMapValue_t FormatTargetMapValue[MAX_MAP_SEG_COUNT]; //格式化目標映射值組
}LogSegInfo;
其中格式化函數(shù)的表示形式比較特殊来惧,需要對其進行字符串匹配從而完成解析。在定制話單過程中如果需要對一個字段進行特殊功能的配置心例,則可調用程序預先定義好的各類格式化函數(shù)宵凌。在配置文件中其表示形式如下:
COND(Type1+Type2+...)FUNC_XXX(nMaxLen 'aFormatStr' 'aDefaultStr' segIndex1+ segIndex2+...)
UniformProcessor::GetChannelFormat函數(shù)實現(xiàn)了對話單格式的配置文件的解析。通過字符串匹配的方式實現(xiàn)對配置項的讀取止后,過程中要嚴格控制字符串數(shù)組指針的移動長度瞎惫,否則會出錯。現(xiàn)階段有一部分函數(shù)需要四個參數(shù)(nMaxLen 译株,aFormatStr 瓜喇,aDefaultStr ,aFormatInde)歉糜,一部分函數(shù)只需要三個參數(shù)(aFormatStr 乘寒,aDefaultStr ,aFormatIndex)匪补。
通用輸入?yún)?shù)
COND(Type1+Type2+...):指定COND中包含的XDR類型按指定規(guī)則填寫字段伞辛。應用場景是:同一字段因APP類型不同而需要使用不同的格式化方法。
func_ :若出現(xiàn)func_前綴則表示用戶需要對該字段進行特殊格式化夯缺。若無此關鍵字則直接寫入配置索引下的字段的值蚤氏。
nMaxLen:部分函數(shù)使用。限定獲取字段的最大長度
aFormatStr: 全部函數(shù)使用踊兜。格式化模版竿滨,例如指定日期的表示形式。如有賦值润文,則后續(xù)格式化字段要參考該模版姐呐。
aDefaultStr: 全部函數(shù)使用。缺省值字符串典蝌,指定某個字段用缺省值代替曙砂,或者在格式化出錯時將字段賦缺省值。
函數(shù)定義
FUNC_TIME(’TimeFormat’ ‘’ segIndex)
示例:FUNC_TIME('%Y-%m-%d %H:%M:%S' '' 33)
輸出:2018-03-01 13:23:21
- 功能:按照TimeFormat的格式來寫字段序號為segIndex的話單字段骏掀,
- 備注:這里中間的DefaultStr值為空鸠澈,且該字段序號必須是個時間字段柱告;
FUNC_COMBINE(MaxLen ’format’ ‘’ seg1+seg2+seg3+seg4)
示例:FUNC_COMBINE(0 '' '' 76+39)
輸出:7639
示例:FUNC_COMBINE(4 '1' '' 76+0+39)
輸出:7613
- 功能:最多四個字段能組合在一起作為一個字段輸出,如果seg1~seg4其中有一個為0笑陈,則對應的位置填的是FormatStr參數(shù)的值
- 備注:區(qū)別于DEFAULT际度,一定不能在該函數(shù)中填DefaultStr參數(shù);MaxLen限定該字段的長度涵妥,如為零則不限制乖菱。
FUNC_DEFAULT(MaxLen ’format’ ‘default’ seg1+seg2+seg3+seg4)
示例:FUNC_DEFAULT(0 '' '' 76+39) [76,39字段均為空]
輸出:
示例:FUNC_DEFAULT(4 '1' '' 76+0+39) [76空,39非空]
輸出:139
- 功能:該函數(shù)是在當seg1~seg4中所有字段均為空時填DefaultStr參數(shù)的值蓬网;若seg為0窒所,則將該格式化字段填FormatStr參數(shù)的值;若seg字段不為零帆锋,對指定字段進行組合吵取。
- 備注:MaxLen限定該字段的長度,如為零則不限制锯厢。
FUNC_LEN(’format’ ‘default’ seg1+seg2+seg3+seg4)
示例:FUNC_LEN('' '' 105)
輸出:105.len
- 功能:該函數(shù)在話單中填的是seg1~ seg4組合后的長度值皮官,并不填寫字段內(nèi)容。如果seg1~seg4中的非0序號字段全部為空实辑,則看default參數(shù)是否存在捺氢,default參數(shù)存在就填default的長度,否則就填為format參數(shù)的長度徙菠。
FUNC_SUB(’’ ‘’ seg1+seg2)
示例:FUNC_SUB('' '' 105+20)
輸出:105-20
- 功能:該函數(shù)在話單中填的是seg1和seg2的相減之差值讯沈,差可為正也可為負郁岩。
- 備注:seg1和seg2兩個字段必須為兩個數(shù)字婿奔;
FUNC_MAP(’val1 val2 val3 val4’ ‘Val1 Val2 Val3 Val4’ seg1)
示例:FUNC_MAP('0\1' '1\0' 95)
輸出:0\1
- 功能:該函數(shù)對字段seg1的實際值和要在話單中填寫的值做一個映射,比如實際值是Val1问慎,填寫的值就是val1
- 備注:實際值和填寫值最多可以配四對萍摊,長度不能超過8
FUNC_INT2IP(’’ ‘’ seg1)
示例: FUNC_INT2IP(’’ ‘’ 23)
輸出:192.xxx.xxx.xxx
- 功能:將整型的IP地址轉化為點分形式,寫入話單.
- 備注:seg1必須為一個IP字段如叼;
FUNC_IP2INT(’’ ‘’ seg1)
示例: FUNC_IP2INT(’’ ‘’ 23)
輸出:3232256779
- 功能:將整形的IP地址轉化為點分形式冰木,寫入話單.
- 備注:seg1必須為一個IP字段;
FUNC_DIGEST(’DigestFormat’ ‘FixWidth’ seg1+seg2+seg3+seg4)
示例:FUNC_DIGEST('%x%02d' '' 75+76)
輸出:75字段的十六進制形式76字段的寬度為2的十進制形式
- 功能:該函數(shù)將seg1~seg4的數(shù)字值笼恰,按照DigestFormat的形式來寫到話單中踊沸,并且規(guī)定最大寬度為FixWidth, 如果沒填該參數(shù)就是沒限制,超過寬度的部分舍棄社证。
- 備注:seg1~seg4必須為數(shù)字字段逼龟,如果配了非數(shù)字字段將都按照值為0處理,且為了單獨服務LinkID這個字段追葡,特別規(guī)定了如果真實值為0就略過
FUNC_COUNT( ‘format’ ‘’ seg1+seg2+seg3+seg4)
示例:
輸出:
- 功能:該函數(shù)將在seg1~seg4的組合中查找子字符串或者字符’format’腺律,并將查找到的次數(shù)填寫到該話單字段中奕短;
FUNC_URL(MAX_LEN '' 'default' seg1+seg2)
示例:FUNC_URL(0 '' '' 102+103)
輸出:URL
- 功能:該函數(shù)專門用于填寫URL,seg1為host的序號匀钧,seg2為URI的序號翎碑;
- 備注:當兩者都為空時填入default值。
FUNC_URLLEN(MAX_LEN '' 'default' seg1+seg2)
示例:FUNC_URL(0 '' '' 102+103)
輸出:URL的長度
- 功能: seg1 表示"HOST"之斯,seg2 表示 "URI"日杈,填寫組合成的URL的長度。
- 備注:當兩者都為空時填入default值佑刷。
FUNC_PID(’’ ‘’ seg1)
示例:FUNC_PID('' '' 36)
輸出:36對應的協(xié)議名稱
- 功能:該函數(shù)專門為protocolID字段服務达椰,seg1是PID字段在合集中的序號,該函數(shù)在話單中填PID對應的協(xié)議名稱字符串而非編號项乒;
FUNC_uS2S(’’ ‘’ seg1)
示例:FUNC_uS2S('' '' 35)
輸出:35字段的秒形式
- 功能:將指定字段的毫秒的形式轉化為秒的形式
FUNC_ALL_F(‘’ ‘count’ seg1)
示例:FUNC_ALL_F('' '8' 0)
輸出:FFFFFFFF
- 功能:如果seg1有值啰劲,直接填該字段的值。如果為空檀何,寫count個F
- 備注:感覺有點小問題
FUNC_ENCODE('' '' seg1+seg2)
示例:
輸出:
- 功能:seg1是一個時間字段蝇裤,使用后四位作為編碼的key對seg2字段進行編碼。
FUNC_ENCODECT('' '' seg1)
示例:
輸出:
- 功能:seg1是http content-type 索引字段,填寫 HTTPContentType.txt 中的內(nèi)容代替原始包中的內(nèi)容
FUNC_CUTOFF('number' 'default' seg1)
示例:
輸出:
- 功能:將seg1字段的尾部剪裁掉number個字節(jié)频鉴。如果原有長度不夠栓辜,直接填寫default的值。
FUNC_SPLITCOUNT('delimiter' '' seg)
示例:FUNC_SPLITCOUNT(';' '' 101)
輸出:
- 功能:計算seg字段中使用delimiter分隔符的數(shù)量
FUNC_FTPURL(MAX_LEN '' 'default' seg1+seg2)
示例:
輸出:ftp://ServerIP:21 FilePath
- 功能:seg1是 "ServerIP"垛孔, seg2是"FilePath"藕甩,輸出FTP的URL。如果ServerIP是"0.0.0.0"周荐,該字段寫default值