一种获取Linux虚拟机内部日志的方法
【技术领域】
[0001]本发明涉及云计算管理技术领域,特别是指一种获取Linux虚拟机内部日志的方法。
【背景技术】
[0002]在云计算环境下,虚拟机被广泛使用,对于虚拟机的维护要求越来越高,当虚拟机出现故障,需要进行故障排查时,通常需要查看虚拟机内部日志,一般只能通过跟客户获取虚拟机用户名及密码,进入虚拟机内部查看日志,根据日志排查故障。
[0003]上述方法存在以下弊端:
[0004]1、对于客户数据安全没有保障,需要跟客户获取用户名密码,才能进入虚拟机内部;
[0005]2、排查所花时间较长,需要获取密码及进入虚拟机内部。
【发明内容】
[0006]本发明解决的技术问题在于提供一种获取Linux虚拟机内部日志的方法,解决传统方法存在的不足,保障客户虚拟机数据安全,提高运维效率,为虚拟机运维提供一种可行的解决方案。
[0007]本发明解决上述技术问题的技术方案是:
[0008]所述的方法包括如下步骤:
[0009]步骤1:登录云平台管理端,选择要查看日志的虚拟机
[0010]步骤2:输入查询条件,查询虚拟机系统日志
[0011]步骤3:查询命令发送到虚拟机客户端
[0012]步骤4:虚拟机客户端读取当天系统日志,返回结果。
[0013]所述的云平台管理端,是统一的虚拟化管理平台,能够对外提供统一的管理接P ;
[0014]所述的日志,是虚拟机内部日志,包含linux的/var/log/messages、/var/log/syslog、/var/log/user.log、/var/log/auth.log 四个文件;所述的 /var/log/messages 包括整体系统信息,其中也包含系统启动期间的日志;所述的/var/log/syslog只记录警告信息,常常是系统出问题的信息;所述/var/log/user.log记录所有等级用户信息的日志;所述的/var/log/auth.log包含系统授权信息,包括用户登录和使用的权限机制等。
[0015]所述的输入查询条件,是指需要从虚拟机内部要获取的日志类型及时间。
[0016]所述的虚拟机客户端,是安装在虚拟机内部的程序,通过串口通信协议与云平台管理端通信;所述的串口通信协议,指串口按位(bit)发送和接收字节。
[0017]本发明的方法保障客户数据安全,无需获取虚拟机用户名密码;具有通用性,针对Linux操作系统都能使用;简单快捷,无需进入虚拟机内部即可查看最新系统日志。
【附图说明】
[0018]下面结合附图对本发明进一步说明:
[0019]图1为本发明的流程图;
[0020]图2为本发明的技术原理图;
【具体实施方式】
[0021]如图1、2所示,本发明具体实施过程如下:
[0022]1、登录云平台管理端,选择要查看日志的虚拟机;
[0023]2、输入查询条件,查询虚拟机系统日志
[0024]/**
[0025]^searchVmEvent查询虚拟机日志.
[0026]*@param beginTime 日志开始时间
[0027]*@param endTime 日志结束时间
[0028]^Oparam eventType日志类型:错误、告警、正常
[0029]*@param evList 查询返回列表
[0030]*/
[0031]public ListsearchVmEvent(Date beginTime, Date endTime, StringeventType)
[0032]{
[0033]ListevList = new ArrayList();
[0034]evList = gComputerService.searchVmEvent(beginTime? endTime,eventType);
[0035]return evList ;
[0036]}
[0037]3、查询命令发送到虚拟机客户端;
[0038]windows系统日志的地址存在项目的address, properties配置里面
[0039]addressl = /var/log/messages
[0040]address2 = /var/log/syslog
[0041]address3 = /var/log/user.log
[0042]address3 = /var/log/auth.log
[0043]在xml配置文件中,导入address, properities文件
[0044]〈bean id=" propertyConf igurer!! class =" org.springframewornf ig.PropertyPlaceholderConfigurer" >
[0045]〈property name = " ignoreResourceNotFound" value = " true" />
[0046]〈property name = " locat1ns" >
[0047]〈list〉
[0048]/WEB-1NF/address.properties
[0049]〈/list〉
[0050]
[0051]
[0052]〈bean id = " proxyNameclass = " xxx.xxx.xxx.ProxyClass>
[0053] {addressl}〈/value〉
[0054]
[0055]4、虚拟机客户端读取当天系统日志,返回结果;
[0056]/*void Read—event (os—el*el)读取系统的日志详情
[0057]^Reads the event log.
[0058]*/
[0059]void Read—event(os_el*el, int printit)
[0060]{
[0061]DWORD nstr ;
[0062]DWORD user—size ;
[0063]DWORD domain—size ;
[0064]DWORD read,needed ;
[0065]int Size—left ;
[0066]int str—size ;
[0067]char*mbuffer[BUFFER—SIZE];
[0068]LPSTR sstr = NULL ;
[0069]char*tmp—str = NULL ;
[0070]char^event—category ;// 事件类型
[0071]char^event—sourcename ;// 事件来源
[0072]char^event—computername ;// 事件计算机名
[0073]char*event—descriptive—msg ;// 事件描述
[0074]char event—el—user [257] ;//事件用户
[0075]char event—el—domain [257] ;//事件域
[0076]char el—string
[1025];
[0077]char final—out—msg
[1024] ;// 最后输出的信息
[0078]LPSTR el—sstring[57];
[0079]/氺Er must point to the mbuffer木/
[0080]el->er = (EVENTL0GREC0RD*)&mbuffer ;
[0081]/^Zeroing the last values*/
[0082]el_string
[1024] =' \0';
[0083]event—el—user [256] = ' \0f ;
[0084]event—el—domain [256] = ' \0f ;
[0085]final—out—msg
[1023] = ' \0f ;
[0086]el—sstring[56] = NULL ;
[0087]/^Reading the event log*/
[0088]while(ReadEventLog(el_>h,
[0089]EVENTL0G—FORWARDS—READ|EVENTL0G—SEQUENT IAL—READ, 0,
[0090]el_>er,BUFFER—SIZE-1,&read,&needed))
[0091]{
[0092]while (read>0)
[0093]{
[0094]/氺We need to initialize every variable before the loop氺/
[0095]//得到事件的类型
[0096]event_category = el—GetCategory(el_>er_>EventType);
[0097]//得到事件来源
[0098]event—sourcename = (LPSTR)((LPBYTE)el->er+sizeof(EVENTL0GREC0RD));
[0099]//得到计算机名
[0100]event_computername = event_sourcename + strlen (event_sourcename)+1 ;
[0101]//给描述信息初始化
[0102]event_descriptive_msg = NULL ;
[0103]/* 初始化 domain/user 尺寸 */
[0104]user—size = 255 ;domain—size = 255 ;
[0105]event—el—domain [0] =