UASG話單定制化文檔

解析配置文件

結(jié)構(gòu)體定義

在UASG中定義了LogSegInfo結(jié)構(gòu)體保存配置文件中用戶對每一個字段的配置信息,從而實現(xiàn)配置文件的解析。每一個結(jié)構(gòu)體對應(yīng)一個話單字段,LogSegInfo結(jié)構(gòu)體數(shù)組就對應(yīng)了一個完整的話單格式。

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ù)名進(jìn)行匹配的函數(shù)指針
    unsigned char cIndexCount;                        //一共有多少個序號(組合字段含有多于一個字段序號)
    unsigned char aFormatIndex[MAX_COUNT_IN_SECTION]; //格式化的序號
    char          aFormatStr[MAX_FORMAT_LEN];         //進(jìn)行格式化的目標(biāo)字符串
    int           nFormatStrLen;                      //目標(biāo)字符串長度
    char          aDefaultStr[MAX_DEFAULT_LEN];       //默認(rèn)字符串
    int           nDefaultStrLen;                     // 默認(rèn)字符串長度
    TargetMapValue_t FormatTargetMapValue[MAX_MAP_SEG_COUNT]; //格式化目標(biāo)映射值組
}LogSegInfo;

其中格式化函數(shù)的表示形式比較特殊,需要對其進(jìn)行字符串匹配從而完成解析。在定制話單過程中如果需要對一個字段進(jìn)行特殊功能的配置,則可調(diào)用程序預(yù)先定義好的各類格式化函數(shù)。在配置文件中其表示形式如下:

COND(Type1+Type2+...)FUNC_XXX(nMaxLen 'aFormatStr' 'aDefaultStr' segIndex1+ segIndex2+...)

UniformProcessor::GetChannelFormat函數(shù)實現(xiàn)了對話單格式的配置文件的解析。通過字符串匹配的方式實現(xiàn)對配置項的讀取,過程中要嚴(yán)格控制字符串?dāng)?shù)組指針的移動長度,否則會出錯?,F(xiàn)階段有一部分函數(shù)需要四個參數(shù)(nMaxLen ,aFormatStr ,aDefaultStr ,aFormatInde),一部分函數(shù)只需要三個參數(shù)(aFormatStr ,aDefaultStr ,aFormatIndex)。

通用輸入?yún)?shù)

  • COND(Type1+Type2+...):指定COND中包含的XDR類型按指定規(guī)則填寫字段。應(yīng)用場景是:同一字段因APP類型不同而需要使用不同的格式化方法。

  • func_ :若出現(xiàn)func_前綴則表示用戶需要對該字段進(jìn)行特殊格式化。若無此關(guān)鍵字則直接寫入配置索引下的字段的值。

  • 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,則對應(yīng)的位置填的是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ù)是在當(dāng)seg1~seg4中所有字段均為空時填DefaultStr參數(shù)的值;若seg為0,則將該格式化字段填FormatStr參數(shù)的值;若seg字段不為零,對指定字段進(jìn)行組合。
  • 備注: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的相減之差值,差可為正也可為負(fù)。
  • 備注: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地址轉(zhuǎn)化為點(diǎn)分形式,寫入話單.
  • 備注:seg1必須為一個IP字段;
 FUNC_IP2INT(’’ ‘’ seg1)
 示例: FUNC_IP2INT(’’ ‘’ 23)
 輸出:3232256779
  • 功能:將整形的IP地址轉(zhuǎn)化為點(diǎn)分形式,寫入話單.
  • 備注:seg1必須為一個IP字段;
 FUNC_DIGEST(’DigestFormat’ ‘FixWidth’ seg1+seg2+seg3+seg4)
 示例:FUNC_DIGEST('%x%02d' '' 75+76)
 輸出:75字段的十六進(jìn)制形式76字段的寬度為2的十進(jìn)制形式
  • 功能:該函數(shù)將seg1~seg4的數(shù)字值,按照DigestFormat的形式來寫到話單中,并且規(guī)定最大寬度為FixWidth, 如果沒填該參數(shù)就是沒限制,超過寬度的部分舍棄。
  • 備注:seg1~seg4必須為數(shù)字字段,如果配了非數(shù)字字段將都按照值為0處理,且為了單獨(dú)服務(wù)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的序號;
  • 備注:當(dāng)兩者都為空時填入default值。
 FUNC_URLLEN(MAX_LEN '' 'default' seg1+seg2)
 示例:FUNC_URL(0 '' '' 102+103)
 輸出:URL的長度
  • 功能: seg1 表示"HOST",seg2 表示 "URI",填寫組合成的URL的長度。
  • 備注:當(dāng)兩者都為空時填入default值。
 FUNC_PID(’’ ‘’ seg1)
 示例:FUNC_PID('' '' 36)
 輸出:36對應(yīng)的協(xié)議名稱
  • 功能:該函數(shù)專門為protocolID字段服務(wù),seg1是PID字段在合集中的序號,該函數(shù)在話單中填PID對應(yīng)的協(xié)議名稱字符串而非編號;
 FUNC_uS2S(’’ ‘’ seg1) 
 示例:FUNC_uS2S('' '' 35)
 輸出:35字段的秒形式
  • 功能:將指定字段的毫秒的形式轉(zhuǎn)化為秒的形式
 FUNC_ALL_F(‘’ ‘count’ seg1)
 示例:FUNC_ALL_F('' '8' 0)
 輸出:FFFFFFFF
  • 功能:如果seg1有值,直接填該字段的值。如果為空,寫count個F
  • 備注:感覺有點(diǎn)小問題
 FUNC_ENCODE('' '' seg1+seg2)
 示例:
 輸出:
  • 功能:seg1是一個時間字段,使用后四位作為編碼的key對seg2字段進(jìn)行編碼。
 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值
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 14,288評論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,309評論 6 13
  • “陌上人如玉,公子世無雙”,你第一次看到這句話時對古人說的話是滿滿的喜愛。 你也驚訝怎么有人會把你心里所有的感受都...
    大大大喜寶閱讀 300評論 1 0
  • 最近參與公司的實習(xí)生招聘工作,面試了幾位實習(xí)生,我有一道每次面試都必問的題目【HasmMap的工作原理】,但很遺憾...
    竹子柳閱讀 2,339評論 0 4

友情鏈接更多精彩內(nèi)容