解析配置文件
结构体定义
在UASG中定义了LogSegInfo
结构体保存配置文件中用户对每一个字段的配置信息,从而实现配置文件的解析。每一个结构体对应一个话单字段,LogSegInfo结构体数组就对应了一个完整的话单格式。
typedef struct LogSegInfo_s
{
short nCondxDRType[XDRLOG_TYPE_MAX]; //保存COND指定的XDR类型
int nMaxLen; //字段最大长度限制
int (*pSegFormatFunc)(char *pBuffer, LogSegInfo_s *pLogSegInfo, LogInfo_t *pLogInfo); //根据函数名进行匹配的函数指针
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;
其中格式化函数的表示形式比较特殊,需要对其进行字符串匹配从而完成解析。在定制话单过程中如果需要对一个字段进行特殊功能的配置,则可调用程序预先定义好的各类格式化函数。在配置文件中其表示形式如下:
COND(Type1+Type2+...)FUNC_XXX(nMaxLen 'aFormatStr' 'aDefaultStr' segIndex1+ segIndex2+...)
UniformProcessor::GetChannelFormat函数实现了对话单格式的配置文件的解析。通过字符串匹配的方式实现对配置项的读取,过程中要严格控制字符串数组指针的移动长度,否则会出错。现阶段有一部分函数需要四个参数(nMaxLen ,aFormatStr ,aDefaultStr ,aFormatInde),一部分函数只需要三个参数(aFormatStr ,aDefaultStr ,aFormatIndex)。
通用输入参数
COND(Type1+Type2+...):指定COND中包含的XDR类型按指定规则填写字段。应用场景是:同一字段因APP类型不同而需要使用不同的格式化方法。
func_ :若出现func_前缀则表示用户需要对该字段进行特殊格式化。若无此关键字则直接写入配置索引下的字段的值。
nMaxLen:部分函数使用。限定获取字段的最大长度
aFormatStr: 全部函数使用。格式化模版,例如指定日期的表示形式。如有赋值,则后续格式化字段要参考该模版。
aDefaultStr: 全部函数使用。缺省值字符串,指定某个字段用缺省值代替,或者在格式化出错时将字段赋缺省值。
函数定义
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参数的值
- 备注:区别于DEFAULT,一定不能在该函数中填DefaultStr参数;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
- 功能:该函数是在当seg1~seg4中所有字段均为空时填DefaultStr参数的值;若seg为0,则将该格式化字段填FormatStr参数的值;若seg字段不为零,对指定字段进行组合。
- 备注:MaxLen限定该字段的长度,如为零则不限制。
FUNC_LEN(’format’ ‘default’ seg1+seg2+seg3+seg4)
示例:FUNC_LEN('' '' 105)
输出:105.len
- 功能:该函数在话单中填的是seg1~ seg4组合后的长度值,并不填写字段内容。如果seg1~seg4中的非0序号字段全部为空,则看default参数是否存在,default参数存在就填default的长度,否则就填为format参数的长度。
FUNC_SUB(’’ ‘’ seg1+seg2)
示例:FUNC_SUB('' '' 105+20)
输出:105-20
- 功能:该函数在话单中填的是seg1和seg2的相减之差值,差可为正也可为负。
- 备注:seg1和seg2两个字段必须为两个数字;
FUNC_MAP(’val1 val2 val3 val4’ ‘Val1 Val2 Val3 Val4’ seg1)
示例:FUNC_MAP('0\1' '1\0' 95)
输出:0\1
- 功能:该函数对字段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的十进制形式
- 功能:该函数将seg1~seg4的数字值,按照DigestFormat的形式来写到话单中,并且规定最大宽度为FixWidth, 如果没填该参数就是没限制,超过宽度的部分舍弃。
- 备注:seg1~seg4必须为数字字段,如果配了非数字字段将都按照值为0处理,且为了单独服务LinkID这个字段,特别规定了如果真实值为0就略过
FUNC_COUNT( ‘format’ ‘’ seg1+seg2+seg3+seg4)
示例:
输出:
- 功能:该函数将在seg1~seg4的组合中查找子字符串或者字符’format’,并将查找到的次数填写到该话单字段中;
FUNC_URL(MAX_LEN '' 'default' seg1+seg2)
示例:FUNC_URL(0 '' '' 102+103)
输出:URL
- 功能:该函数专门用于填写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对应的协议名称
- 功能:该函数专门为protocolID字段服务,seg1是PID字段在合集中的序号,该函数在话单中填PID对应的协议名称字符串而非编号;
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 中的内容代替原始包中的内容
FUNC_CUTOFF('number' 'default' seg1)
示例:
输出:
- 功能:将seg1字段的尾部剪裁掉number个字节。如果原有长度不够,直接填写default的值。
FUNC_SPLITCOUNT('delimiter' '' seg)
示例:FUNC_SPLITCOUNT(';' '' 101)
输出:
- 功能:计算seg字段中使用delimiter分隔符的数量
FUNC_FTPURL(MAX_LEN '' 'default' seg1+seg2)
示例:
输出:ftp://ServerIP:21 FilePath
- 功能:seg1是 "ServerIP", seg2是"FilePath",输出FTP的URL。如果ServerIP是"0.0.0.0",该字段写default值