监控日志数据库系统的开发研究及业务应用

2014-11-04 02:24王文岳
电脑知识与技术 2014年28期

王文岳

摘要:为解决传统监控日志录入不规范及数据管理差的弊端,提出了一种基于mfc定制前端,和嵌入式数据库SQLite作为后台调度的解决方案,并且已在天津网络广播电视台运维部的工作中得到了有效的应用。介绍了此系统的开发设想、开发技术、功能应用等。实践表明,该系统的引入对运维部门信息管理、数据分析能充分发挥其高效、精确的优势。

关键词: SQLite数据库; MFC; 嵌入式开发; 监控日志管理

中图分类号:TP392 文献标识码:A 文章编号:1009-3044(2014)28-6598-05

先前天津IPTV监控日志均为手写和word文档记录,通过日积月累的记录数据,为研究解决故障提供了依据,对于新设备、新配置也是起到观察反馈的作用。但是随着IPTV平台的业务发展扩大,日常监控任务更加繁重,数据量急剧增,传统形式的日志记录在规范录入、使用、统计查询等方面效率低下,无法真实有效利用起庞大的数据做大数据挖掘,也不能满足日益提高的维护标准。在此背景下,本人研发基于MFC (Microsoft Foundation Classes)界面,使用VC++编程完成模拟监控日志记录流程系统前端并嵌入SQLite数据库作为底层管理调用的一套完整解决方案来替代原有形式。希望通过本文的解决方案能为广电系统乃至其他注重记录日志信息的单位在实现现代化信息管理采集上提供一些参考。

1 开发流程

1.1 开发设想

主要替代每天的监控日志,由目前的word文档记录形式转变为通过自制MFC前端录入进嵌入式SQLite数据库的形式。其优势在于一方面可以规范数据采集形式,避免人为错误和不规范行为,为每个录入点建立一套独立的记录档案;更重要的是另一方面可以方便查询,精确到任何一种类型、一台设备、一个频道、一类故障都可以根据条件迅速定位,减轻人员的工作负担,高效管理大量的趋于碎片化的数据,评估运行情况,预警和规避问题发生,从而大幅提升部门工作效率。同时,对于监控员在录入故障信息时由被动的根据报警信息记录转型为主观判断故障点来记录,熟悉设备链路,提高排障精准度和技能熟练度。

设计的思路和基本模型如图1所示,主要分为数据库层面以及MFC为基础的前端软件层面。记录的信息通过 SQLite 数据库函数接口存储到本地数据库中,通过 MFC 函数库实现前端的操作。数据库文件与前端软件分离,方便软件更新功能扩展以及本地数据库备份。

1.2 数据库设计

对于数据库的选择,经过与Mysql、PostgreSQL、Access等对比与试验,最终选择的是SQLite 开源嵌入式数据库。其优势在于以下几点:

1) SQLite 属于一款开源的、遵守ACID、可嵌入的轻量关系数据库。它提供了对ANSI SQL92 的大多数支持。如Access数据库不支持事务操作,无法定制最合适的前端。

2) 适应多种操作系统如:Windows/Linux/Unix以及多种程序语言如:C/C++、PHP、Java等。这也是最终能完成软件系统的支撑点。

3) SQLite对比Mysql、PostgreSQL这两款开源数据库,无需任何配置部署或安装任何其他的框架,速度更快,体积最小。

4) SQLite引擎占用资源低,和C/S构架不同,无中间服务进程,其作为连接到程序的主要组成部分,直接读写磁盘上的数据库文件,减少内存消耗和时间延迟。

5) SQLite历经近14个年头的开发完善,可以支持2TB大小的数据库文件,支持完整的Unicode 编码,中文环境适应性很好,可以保存任意类型的数据。SQLite的稳定兼容性,对于日志录入这种轻量级应用,毋庸置疑。

SQLite 数据库是以表的形式存储数据,本系统的数据表结构设计如下表1所示,包含10项条目。

表1 设计的数据表结构

[序号\&fault_id\&整型\&主键 自动录入\&登录人\&user\&字符型\&手动输入(可查项)\&日期\&date\&日期型\&手动输入(可查项)\&时间\&time\&字符型\&手动输入\&平台\&path\&字符型\&下拉菜单选择(可查项)\&信源类型\&source\&字符型\&下拉菜单选择(可查项)\&故障节点\&node\&字符型\&下拉菜单选择(可查项)\&故障频道\&program\&字符型\&下拉菜单选择(可查项)\&故障原因\&description\&字符型\&下拉菜单选择(可查项)\&备注\&remark\&字符型\&手动输入\&]

1.3 软件设计

基于MFC的非模态对话框设计,以模块化逐层对话框展开呈现,支持后续的功能扩展,目前除包含录入与查询的基础功能之外,还附加通知和通讯录功能。具体的界面安排及实现全部本着贴近实际使用流程而布置,也保障了从思维模式到使用习惯的平稳过渡,另外查询结果可以完整导出到Excel文档中,方便转发以及更高自由度的灵活编辑,弥补了数据库格式化以及本地化存储的局限性。

1.3.1 开始界面

开始界面(图2) 分为录入、查询、通知、通讯录四个子模块,每个子模块对话框都以非模态为基础支持并发打开操作、拖动等,互不影响限制。开始界面在最小化时做了托盘处理,减少任务栏的占用,也防止误关闭。另外,通过增加布尔型变量InitDabase() 判断数据库初始化是否成功。如果判断条件失败,会通过函数AfxMessageBox弹出消息框“打开数据库失败”,同时EnableWindow函数将录入和查询模块锁定为禁止状态,避免使用人员在做无用功。

1.3.2 录入模块

录入界面(图3) 分为登录人、日期、时间、平台、信源类型、故障节点、故障频道、故障现象、备注9个可录入点来完成一张表的日志信息录入工作。其中平台、信源类型、故障节点、故障频道、故障现象项都可以通过下拉菜单的形式直接选择所,备注部分用来完善辅助补充说明现象、处理情况等,可以在此灵活描述。

主要用到的MFC控件有Edit Control和Combo-box Control两项。通过GetWindowText函数将每个控件内的具体数据写入字符数组,调用已定义的Faults类下的成员函数SetXX和GetXX进行赋值与传参,使用sql语句执行insert插入语句并调用api ExecSQL(sql) 执行底层操作(图4) 。

期间又增加了两项安全提示:一、用逻辑或的关系将“登录人”、“日期”、“时间”三项需操作人手动填入的进行判断,任意一栏没填则弹出Message提示,防止漏填。其二,在点击“录入”按钮时添加MessageBox提示“是否确定录入”,给操作人一个修改检查的机会。最后根据录入返回值提示录入成功或失败。

1.3.3 查询模块

查询界面(图5) 分为登录人、日期、平台、信源类型、故障节点、故障频道、故障现象 7个可复选选项,通过任意条件组合可以迅速精确定位到查询结果,所得结果以建立窗体列表形式呈现。查询结果有数据统计、删除以及保存功能并支持完整导入到Excel文档。

主要用到的MFC控件有List Control、Check-box Control、Combo-box Control和Edit Control。对于复选组合这部分的实现,分控件勾选和逻辑实现两部分。使用GetCheck()函数去判断选项是否勾选,定义变量 ifFirstChoice作为逻辑判断,并赋予初始值为true,将其放在条件语句中作为判断sql查询语句后是否加“and”的依据(图6) 。根据选择的条件将查询结果返回到vector数组中,最后插入到CListCtrl控件中显示。

在查询的同时,使用GetItemCount()函数得到查询结果数量,并通过静态文本显示统计结果。删除部分的功能,由于两条记录总会有可能完全一样,所以选取唯一每条信息的ID值作为sql删除语句的条件。使用OnNMClick事件处理配合GetFirstSelectedItemPosition函数通过点击某一行得到当前行数以及第0列中存储的这条记录fault_id号。根据行号从CListCtrl列表中删除所显示内容,根据记录的fault_id号删除在数据库中对应记录内容。删除前依旧使用MessageBox做删除提示,防止误删。

保存功能,使用api SHGetSpecialFolderPath获取当前用户的桌面路径,通过文件流格式化输出(图8) ,将存储在数组里的数据以txt形式保存到桌面,并以tab键作为分隔符以支持完整格式导入到Excel文件中。

1.3.4 通知模块

在Edit Control控件内写入需要转达的通知,和其他模块窗口不同,并不使用DestroyWindow()在关闭窗口时进行销毁,所以可以在内存中保留数据。用MFC封装的CStdioFile类进行文件流操作,完成文本形式的本地读取与存储功能。运用setlocale()函数进行环境设置以便解决读取文本时Unicode和ANSI编码之间不兼容的转换问题。同时在读取时利用LineScroll使垂直滚动条自动滚动到底端,方便操作者看到最新的通知。

另外有提醒功能,点击“提醒”按钮出现“有一条新通知,请查看!!”的醒目水印,通过设置全局变量将此静态文本传递到通知、查询、录入三个界面中。使用者在看到提醒并阅读通知后,可以点击已阅来取消水印(图7) 。

1.3.5 通讯录模块

使用CListCtrl控件,将公司各部、集团相关重要部门、合作方以及各系统第三方技术支持等重要人员信息以及联系方式都一一汇总,方便应急联系。可通过查找关键词迅速定位。

其原理是通过每行和每列的遍历将关键词变量myFindStr与列表内荣进行核实匹配,先将所有匹配项保存坐标到二维数组resultVector里。点击查找时,垂直滚动条滚动到二维数字里第一条保存结果所在的行数并且高亮。通过条件语句判断,如果此时再点击查找且所搜索的关键词与第一次相同即lastSearchStr = myFindStr,则指针累加移动一位,起到“查找下一个”的作用。反之,则二维数组清零重新遍历(图8) 。

2 应用情况

天津IPTV监控日志数据库系统自上线运行以来近半年多的时间,累积了六千多条日志记录,运行情况平稳良好,也以系统为依据为运维部提供大数据挖掘分析:回顾过往,通过环比同比总结的故障事件频率,吸取经验,摸索规律,优化方案配置;展望未来,通过趋势走向,为设备性能扩容提升,设备老化维护,运营环境变化做了及时的预测与警示。

犹如新媒体IPTV业务在传统广电行业的异军突起,新的日志记录系统对于传统的工作方式无疑是一种更加智能、先进的现代化办公解决方案。通过此套系统,为与日俱增的运维工作为与日俱增的运维工作提供了指导,提高了效率,解决了问题,从而促进IPTV平台的发展和公司业务质量的大步提升。

参考文献:

[1] SQLite数据库源代码和使用指导及示范.SQLite官方网站[EB/OL].http://www.sqlite.org.

[2] MFC类使用指导及示范.Microsoft开发人员网络.MFC类[EB/OL].http://msdn.microsoft.com.

[3] 李素丽,粱慎青,徐美红.值班日志网站的开发及业务应用[J].广东气象,2008,30(2):53,61.

[4] 韩善锋,曹凤海,易昌华.SQLite 数据库在嵌入式程序开发中的应用[J].物探装备,2011,21(3):171-173.

[5] 张洋.基于SQLite的数字博物馆导游器的设计与实现[D].广州:华南理工大学,2010.

主要用到的MFC控件有Edit Control和Combo-box Control两项。通过GetWindowText函数将每个控件内的具体数据写入字符数组,调用已定义的Faults类下的成员函数SetXX和GetXX进行赋值与传参,使用sql语句执行insert插入语句并调用api ExecSQL(sql) 执行底层操作(图4) 。

期间又增加了两项安全提示:一、用逻辑或的关系将“登录人”、“日期”、“时间”三项需操作人手动填入的进行判断,任意一栏没填则弹出Message提示,防止漏填。其二,在点击“录入”按钮时添加MessageBox提示“是否确定录入”,给操作人一个修改检查的机会。最后根据录入返回值提示录入成功或失败。

1.3.3 查询模块

查询界面(图5) 分为登录人、日期、平台、信源类型、故障节点、故障频道、故障现象 7个可复选选项,通过任意条件组合可以迅速精确定位到查询结果,所得结果以建立窗体列表形式呈现。查询结果有数据统计、删除以及保存功能并支持完整导入到Excel文档。

主要用到的MFC控件有List Control、Check-box Control、Combo-box Control和Edit Control。对于复选组合这部分的实现,分控件勾选和逻辑实现两部分。使用GetCheck()函数去判断选项是否勾选,定义变量 ifFirstChoice作为逻辑判断,并赋予初始值为true,将其放在条件语句中作为判断sql查询语句后是否加“and”的依据(图6) 。根据选择的条件将查询结果返回到vector数组中,最后插入到CListCtrl控件中显示。

在查询的同时,使用GetItemCount()函数得到查询结果数量,并通过静态文本显示统计结果。删除部分的功能,由于两条记录总会有可能完全一样,所以选取唯一每条信息的ID值作为sql删除语句的条件。使用OnNMClick事件处理配合GetFirstSelectedItemPosition函数通过点击某一行得到当前行数以及第0列中存储的这条记录fault_id号。根据行号从CListCtrl列表中删除所显示内容,根据记录的fault_id号删除在数据库中对应记录内容。删除前依旧使用MessageBox做删除提示,防止误删。

保存功能,使用api SHGetSpecialFolderPath获取当前用户的桌面路径,通过文件流格式化输出(图8) ,将存储在数组里的数据以txt形式保存到桌面,并以tab键作为分隔符以支持完整格式导入到Excel文件中。

1.3.4 通知模块

在Edit Control控件内写入需要转达的通知,和其他模块窗口不同,并不使用DestroyWindow()在关闭窗口时进行销毁,所以可以在内存中保留数据。用MFC封装的CStdioFile类进行文件流操作,完成文本形式的本地读取与存储功能。运用setlocale()函数进行环境设置以便解决读取文本时Unicode和ANSI编码之间不兼容的转换问题。同时在读取时利用LineScroll使垂直滚动条自动滚动到底端,方便操作者看到最新的通知。

另外有提醒功能,点击“提醒”按钮出现“有一条新通知,请查看!!”的醒目水印,通过设置全局变量将此静态文本传递到通知、查询、录入三个界面中。使用者在看到提醒并阅读通知后,可以点击已阅来取消水印(图7) 。

1.3.5 通讯录模块

使用CListCtrl控件,将公司各部、集团相关重要部门、合作方以及各系统第三方技术支持等重要人员信息以及联系方式都一一汇总,方便应急联系。可通过查找关键词迅速定位。

其原理是通过每行和每列的遍历将关键词变量myFindStr与列表内荣进行核实匹配,先将所有匹配项保存坐标到二维数组resultVector里。点击查找时,垂直滚动条滚动到二维数字里第一条保存结果所在的行数并且高亮。通过条件语句判断,如果此时再点击查找且所搜索的关键词与第一次相同即lastSearchStr = myFindStr,则指针累加移动一位,起到“查找下一个”的作用。反之,则二维数组清零重新遍历(图8) 。

2 应用情况

天津IPTV监控日志数据库系统自上线运行以来近半年多的时间,累积了六千多条日志记录,运行情况平稳良好,也以系统为依据为运维部提供大数据挖掘分析:回顾过往,通过环比同比总结的故障事件频率,吸取经验,摸索规律,优化方案配置;展望未来,通过趋势走向,为设备性能扩容提升,设备老化维护,运营环境变化做了及时的预测与警示。

犹如新媒体IPTV业务在传统广电行业的异军突起,新的日志记录系统对于传统的工作方式无疑是一种更加智能、先进的现代化办公解决方案。通过此套系统,为与日俱增的运维工作为与日俱增的运维工作提供了指导,提高了效率,解决了问题,从而促进IPTV平台的发展和公司业务质量的大步提升。

参考文献:

[1] SQLite数据库源代码和使用指导及示范.SQLite官方网站[EB/OL].http://www.sqlite.org.

[2] MFC类使用指导及示范.Microsoft开发人员网络.MFC类[EB/OL].http://msdn.microsoft.com.

[3] 李素丽,粱慎青,徐美红.值班日志网站的开发及业务应用[J].广东气象,2008,30(2):53,61.

[4] 韩善锋,曹凤海,易昌华.SQLite 数据库在嵌入式程序开发中的应用[J].物探装备,2011,21(3):171-173.

[5] 张洋.基于SQLite的数字博物馆导游器的设计与实现[D].广州:华南理工大学,2010.

主要用到的MFC控件有Edit Control和Combo-box Control两项。通过GetWindowText函数将每个控件内的具体数据写入字符数组,调用已定义的Faults类下的成员函数SetXX和GetXX进行赋值与传参,使用sql语句执行insert插入语句并调用api ExecSQL(sql) 执行底层操作(图4) 。

期间又增加了两项安全提示:一、用逻辑或的关系将“登录人”、“日期”、“时间”三项需操作人手动填入的进行判断,任意一栏没填则弹出Message提示,防止漏填。其二,在点击“录入”按钮时添加MessageBox提示“是否确定录入”,给操作人一个修改检查的机会。最后根据录入返回值提示录入成功或失败。

1.3.3 查询模块

查询界面(图5) 分为登录人、日期、平台、信源类型、故障节点、故障频道、故障现象 7个可复选选项,通过任意条件组合可以迅速精确定位到查询结果,所得结果以建立窗体列表形式呈现。查询结果有数据统计、删除以及保存功能并支持完整导入到Excel文档。

主要用到的MFC控件有List Control、Check-box Control、Combo-box Control和Edit Control。对于复选组合这部分的实现,分控件勾选和逻辑实现两部分。使用GetCheck()函数去判断选项是否勾选,定义变量 ifFirstChoice作为逻辑判断,并赋予初始值为true,将其放在条件语句中作为判断sql查询语句后是否加“and”的依据(图6) 。根据选择的条件将查询结果返回到vector数组中,最后插入到CListCtrl控件中显示。

在查询的同时,使用GetItemCount()函数得到查询结果数量,并通过静态文本显示统计结果。删除部分的功能,由于两条记录总会有可能完全一样,所以选取唯一每条信息的ID值作为sql删除语句的条件。使用OnNMClick事件处理配合GetFirstSelectedItemPosition函数通过点击某一行得到当前行数以及第0列中存储的这条记录fault_id号。根据行号从CListCtrl列表中删除所显示内容,根据记录的fault_id号删除在数据库中对应记录内容。删除前依旧使用MessageBox做删除提示,防止误删。

保存功能,使用api SHGetSpecialFolderPath获取当前用户的桌面路径,通过文件流格式化输出(图8) ,将存储在数组里的数据以txt形式保存到桌面,并以tab键作为分隔符以支持完整格式导入到Excel文件中。

1.3.4 通知模块

在Edit Control控件内写入需要转达的通知,和其他模块窗口不同,并不使用DestroyWindow()在关闭窗口时进行销毁,所以可以在内存中保留数据。用MFC封装的CStdioFile类进行文件流操作,完成文本形式的本地读取与存储功能。运用setlocale()函数进行环境设置以便解决读取文本时Unicode和ANSI编码之间不兼容的转换问题。同时在读取时利用LineScroll使垂直滚动条自动滚动到底端,方便操作者看到最新的通知。

另外有提醒功能,点击“提醒”按钮出现“有一条新通知,请查看!!”的醒目水印,通过设置全局变量将此静态文本传递到通知、查询、录入三个界面中。使用者在看到提醒并阅读通知后,可以点击已阅来取消水印(图7) 。

1.3.5 通讯录模块

使用CListCtrl控件,将公司各部、集团相关重要部门、合作方以及各系统第三方技术支持等重要人员信息以及联系方式都一一汇总,方便应急联系。可通过查找关键词迅速定位。

其原理是通过每行和每列的遍历将关键词变量myFindStr与列表内荣进行核实匹配,先将所有匹配项保存坐标到二维数组resultVector里。点击查找时,垂直滚动条滚动到二维数字里第一条保存结果所在的行数并且高亮。通过条件语句判断,如果此时再点击查找且所搜索的关键词与第一次相同即lastSearchStr = myFindStr,则指针累加移动一位,起到“查找下一个”的作用。反之,则二维数组清零重新遍历(图8) 。

2 应用情况

天津IPTV监控日志数据库系统自上线运行以来近半年多的时间,累积了六千多条日志记录,运行情况平稳良好,也以系统为依据为运维部提供大数据挖掘分析:回顾过往,通过环比同比总结的故障事件频率,吸取经验,摸索规律,优化方案配置;展望未来,通过趋势走向,为设备性能扩容提升,设备老化维护,运营环境变化做了及时的预测与警示。

犹如新媒体IPTV业务在传统广电行业的异军突起,新的日志记录系统对于传统的工作方式无疑是一种更加智能、先进的现代化办公解决方案。通过此套系统,为与日俱增的运维工作为与日俱增的运维工作提供了指导,提高了效率,解决了问题,从而促进IPTV平台的发展和公司业务质量的大步提升。

参考文献:

[1] SQLite数据库源代码和使用指导及示范.SQLite官方网站[EB/OL].http://www.sqlite.org.

[2] MFC类使用指导及示范.Microsoft开发人员网络.MFC类[EB/OL].http://msdn.microsoft.com.

[3] 李素丽,粱慎青,徐美红.值班日志网站的开发及业务应用[J].广东气象,2008,30(2):53,61.

[4] 韩善锋,曹凤海,易昌华.SQLite 数据库在嵌入式程序开发中的应用[J].物探装备,2011,21(3):171-173.

[5] 张洋.基于SQLite的数字博物馆导游器的设计与实现[D].广州:华南理工大学,2010.