Zenoss4.2.3对中文事件的部分支持修改
来源:互联网 发布:理查德费曼算法 编辑:程序博客网 时间:2024/05/16 06:21
Zenoss4.2.3貌似无法支持收集中文事件,修改了部分代码可满足部分收集中文事件的需求。
注意,这不是完美或架构上完全正确解决方案,旨在解决以下部分问题:
- 界面增加事件,dervice和summary包含的中文会丢失
- 外部插入中文事件失败
- window产生的中文日志无法收集
有任何建议或问题欢迎讨论。
背景
Zenoss版本:zenoss_core-4.2.3-x86_64.vmware
读代码准备
曾经花了很大精力安装centos、eclipse搭建开发环境,资料收集能力问题,最终也只能读和修改一下代码,不是必须条件。
实际上直接看、修改代码再看日志输出就可以了,准备:
VS2010+Python Tools for Visual Studio:结合zenoss源代码包查看代码(文件间引用只能搜索查找),修改代码,查看日志。
zenoss虚拟机:同于输出日志(安装ftp(vsftpd)方便传出日志查看)和查看实际运行结果。
MySQL Workbench:查看zenoss的mysql数据库内容。
总解决思路:
zenoss运行环境python的defaultencoding是utf-8,数据库的大部分编码也为utf8,应该是考虑到编码问题要对英文外语言的支持。
事件收集后通过rabbitMQ(不确定是这个名字)缓冲在插入到数据库,这个中间层暂时主要支持unicode。
经测试,在使用这个中间层传输内容前,把中文或者(所有python字符串)转换为unicode格式可顺利传输,并且中文或英文格式内容可插到数据库内。
经测试,数据库中插入的中文界面可直接显示。
具体解决:
界面增加事件,dervice和summary包含的中文会丢失
问题所在:
\Products\Zuul\facades\zepfacade.py内
“args = dict(evid=occurrence_uuid, summary=summary, severity=severity, device=device)”
对summary和device处理后被转换为utf8编码,中间层传输时过滤掉了,应在dict内使用unicode编码。
解决方法:
改为“args = dict(evid=occurrence_uuid, summary=summary.decode(), severity=severity, device=device.decode())”。
外部插入中文事件失败
问题所在:
/Products/ZenEvents/events2/processing.py内
“eventContext.eventProxy.dedupid = '|'.join(dedupIdList)”报错,主要是编码问题。
这是由于dedupIdList存在加工语句
“dedupIdList = [str(getattr(eventContext.eventProxy, field, '')) for
问题所在: field in dedupFields]”
对summary由原来的unicode编码处理后被转换为utf8。
解决方法:
改为“dedupIdList = []
for field in dedupFields:
eachattr = getattr(eventContext.eventProxy, field, '')
if isinstance(eachattr, unicode):
dedupIdList.append(eachattr)
else:
for field in dedupFields:
eachattr = getattr(eventContext.eventProxy, field, '')
if isinstance(eachattr, unicode):
dedupIdList.append(eachattr)
else:
dedupIdList.append(str(eachattr))”
python字符串原来是unicode的字段不使用python内建函数str()处理。
window产生的中文日志无法收集
zeneventlog.py内“evt = dict(
device=self._devId,
eventClassKey=evtkey,
eventGroup=lrec.logfile,
component=lrec.sourcename,
ntevid=lrec.eventcode,
summary=event_message,
agent='zeneventlog',
severity=sev,
monitor=self._preferences.options.monitor,
user=lrec.user,
categorystring=lrec.categorystring,
originaltime=ts,
computername=lrec.computername,
eventidentifier=lrec.eventidentifier,
eventClassKey=evtkey,
eventGroup=lrec.logfile,
component=lrec.sourcename,
ntevid=lrec.eventcode,
summary=event_message,
agent='zeneventlog',
severity=sev,
monitor=self._preferences.options.monitor,
user=lrec.user,
categorystring=lrec.categorystring,
originaltime=ts,
computername=lrec.computername,
eventidentifier=lrec.eventidentifier,
)”处理后summary等多个字段被转换为utf8。
解决方法:
改为
“logfile = lrec.logfile
if logfile and isinstance(logfile, str):
logfile = logfile.decode()
euser = lrec.user
if euser and isinstance(euser, str):
euser = euser.decode()
ecategorystring = lrec.categorystring
if ecategorystring and isinstance(ecategorystring, str):
ecategorystring = ecategorystring.decode()
evt = dict(
device=self._devId.decode(),
eventClassKey=evtkey.decode(),
eventGroup=logfile,
component=lrec.sourcename.decode(),
ntevid=lrec.eventcode,
summary=event_message.decode(),
agent='zeneventlog',
severity=sev,
monitor=self._preferences.options.monitor,
user=euser,
categorystring=ecategorystring,
originaltime=ts,
computername=lrec.computername.decode(),
eventidentifier=lrec.eventidentifier,
)”凡是可能涉及中文的处理为unicode字符串。
if logfile and isinstance(logfile, str):
logfile = logfile.decode()
euser = lrec.user
if euser and isinstance(euser, str):
euser = euser.decode()
ecategorystring = lrec.categorystring
if ecategorystring and isinstance(ecategorystring, str):
ecategorystring = ecategorystring.decode()
evt = dict(
device=self._devId.decode(),
eventClassKey=evtkey.decode(),
eventGroup=logfile,
component=lrec.sourcename.decode(),
ntevid=lrec.eventcode,
summary=event_message.decode(),
agent='zeneventlog',
severity=sev,
monitor=self._preferences.options.monitor,
user=euser,
categorystring=ecategorystring,
originaltime=ts,
computername=lrec.computername.decode(),
eventidentifier=lrec.eventidentifier,
)”凡是可能涉及中文的处理为unicode字符串。
- Zenoss4.2.3对中文事件的部分支持修改
- zenoss4 解决中文事件支持。
- CEGui对中文的支持
- Latex对中文的支持
- TeXmacs对中文的支持
- Trafodion 对中文的支持
- PBDOM对中文的支持
- git对中文的支持
- 探究 Lotus Forms 中的事件处理之第 1 部分:表单对计算功能的支持
- FXLabel支持中文行距的简单修改
- FXLabel支持中文行距的简单修改
- 弥补Reflector对中文支持的不足
- komodo对中文的支持问题
- JSP中对中文的支持
- Motorola J2ME SDK对中文的支持
- 设置PHP对中文的支持
- eclipse+python 对中文的支持
- Vim对中文编码的支持
- 【婷】3-30日 小记
- ping返回的各种信息的含义
- Servlet中doGet与doPost的区别
- 数字黑洞
- 【转】原来是这样:C#中字符串的内存分配与驻留池
- Zenoss4.2.3对中文事件的部分支持修改
- 从B树、B+树、B*树谈到R 树
- linux 下查找文件
- 使用Qt动画框架设计角色的二维动画(二)
- 最简单的屏幕截屏
- Android仿人人客户端(v5.7.1)——授权认证(用accessToken换取session_key、session_secret和userId)
- 三阶魔方玩法总结
- [流水记]2013-03-30
- Counting Bloom Filter