UASG话单定制化文档

解析配置文件

结构体定义

在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值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,671评论 0 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,868评论 6 13
  • “陌上人如玉,公子世无双”,你第一次看到这句话时对古人说的话是满满的喜爱。 你也惊讶怎么有人会把你心里所有的感受都...
    大大大喜宝阅读 246评论 1 0
  • 最近参与公司的实习生招聘工作,面试了几位实习生,我有一道每次面试都必问的题目【HasmMap的工作原理】,但很遗憾...
    竹子柳阅读 2,281评论 0 4