【发明内容】
本发明的目的是提供一种日志管理的实现方法,以达到操作简单、形式灵活多样、可扩展性好的目的。
为达到上述目的,本发明提出以下的技术方案:
一种日志管理的实现方法,该方法包括以下步骤:
A、根据日志信息的类型定义对应的数据结构;
B、接收日志信息到接收缓冲区,根据所述日志信息的类型定义一个该类型的指针,并将所述指针指向接收缓冲区;
C、将全局计数变量值加一并检测当前的全局计数变量值是否大于最大记录条数值,如果是,则将移动文件读写指针到日志文件头处并将全局计数变量清零后加一,执行步骤D;否则,将文件读写指针保持原位,执行步骤D;
D、将所述日志信息按照设定格式写进日志文件形成日志记录;将所述全局计数变量的值转换成字符串,并作为该条记录的标志位写入该条日志记录之后。
优选地,所述步骤A之前还包括步骤:
A1、初始化消息队列和全局计数变量;
A2、检测日志文件是否存在,如果是,则继续执行步骤A3;否则,创建日志文件,再执行步骤A3;
A3、查找所述日志文件的标志位并赋值给所述全局计数变量;
A4、将文件读写指针移动至所述日志记录之后。
其中,所述步骤B具体包括步骤:
B1、消息队列接收日志信息;
B2、所述消息队列将日志信息按优先级从高到低的顺序发送到接收缓冲区;
B3、根据所述日志信息的类型定义一个该类型的指针,并将所述指针指向接收缓冲区。
其中,所述步骤B中接收的日志信息类型为调试信息或异常信息。
其中,所述步骤B3具体过程为:
根据缓冲区第一个字节的数据内容来检测日志信息的类型,并将该指针通过强制类型转换指向接收缓冲区。
优选地,所述步骤B3之后还包括步骤:
B4、检查日志上报的等级设置,并根据所述检查结果和该日志信息的上报级别及所属模块判断是否需要上报到远程操作维护终端,如果是,则将所述日志信息上报到远程操作维护终端,执行步骤C;否则直接执行步骤C。
优选地,所述步骤D之后还包括步骤:
E、将文件读写指针向前移动,移动长度的大小为所述字符串长度的大小。
优选地,所述步骤E之后还包括步骤:
E1、远程操作维护终端向嵌入式设备发出上报命令;
E2、嵌入式设备建立上报文件,按照设定格式写入文件头和日志制作时间;
E3、从所述日志文件中读取日志记录并写入所述上报文件中;
E4、将所述上报文件上传至远程操作维护终端。
其中,所述步骤E3具体包括以下步骤:
E31、打开对应的日志文件,搜索所述标志位,将所述文件读写指针移动到所述标志位之后;
E32、依次读取所述日志文件中的日志记录,并将读到的日志记录写入所述上报文件;
E33、读取日志文件的最后一条日志记录之后,将所述文件读写指针移动到日志文件的文件头,继续读取所述日志文件中的日志记录;
E34、再次读取到标志位时,停止读取所述日志文件中的日志记录,上报文件制作完成。
其中,所述步骤E4具体过程为:
嵌入式设备将所述上报文件通过文件传输协议FTP上传至远程操作维护终端。
从以上技术方案可以看出,本发明根据需要设定多种类型的日志信息,可同时记录几种不同格式的日志文件。当接收到日志信息后,根据日志类型的参数值定义相应数据结构的指针,并将该指针利用强制转换指向接收到的数据,便可很方便地利用此指针对该消息所承载的数据进行操作,不需要进行任何内存分配或拷贝的操作。如果需要改变日志内容的格式,只需修改相应的数据结构即可;如果需要增加新的日志类型,只需要定义相应的日志类型参数值和定义新的数据结构即可。本发明的实现方法可根据需要灵活的设计所需要的日志格式,操作简单方便、易实现,形式灵活多样可扩展性好。
此外,本发明在写入日志信息前,首先将全局计数变量的值加一并检测全局计数变量的值是否大于日志文件所允许记录的最大记录数值,如果小于或等于该值,则将该条记录写入日志文件;如果大于该值,则将全局计数变量归零后加一,并移动文件读写指针到文件头处,然后再将该条信息写入日志文件中。这样就可以通过控制最大记录数的大小来控制日志的大小,使日志文件始终只记录所允许的记录的条数,既避免了随着系统运行时间的增长,日志信息的增多而使日志文件占用的磁盘空间过大的情况出现,又可以保证日志文件所记录的日志内容始终为最新的日志信息。
【具体实施方式】
下面结合具体的实施例对本发明的技术方案进行详细描述。
本发明提供一种日志管理的实现方法,如图1所示,主要包括以下步骤:
步骤S101、根据日志信息的类型定义对应的数据结构。根据用户的具体需要,可以灵活地设置日志内容的记录格式,同时记录几种不同格式的日志文件。
步骤S102、接收日志信息到接收缓冲区,根据所述日志信息的类型定义一个该类型的指针,并将所述指针指向接收缓冲区。当消息队列中有日志信息到达时,日志任务首先从消息队列中接收该条消息到接收缓冲区中,然后依据日志类型参数对该消息进行判断,以确定该条消息的类型,记载信息类型的数据内容一般位于该消息的第一个字节。根据判断结果定义一个该类型的指针,将该指针通过强制类型转换指向接收缓冲区,不需要进行任何内存分配或拷贝的操作,这样便可很方便的通过该指针对接收到的数据进行读取和处理。
步骤S103~S105、将全局计数变量值加一并检测当前的全局计数变量值是否大于最大记录条数值,如果是,则将全局计数变量清零后加一,执行步骤S106;否则,将文件读写指针保持原位,执行步骤S106。将全局计数变量的值加一并检测全局计数变量的值是否大于日志文件所允许记录的最大记录数,如果小于该值,则将该条记录写入日志文件,并接着将全局计数变量的值作为标志位写入该条日志后;如果大于该值,则将全局计数变量归零,并移动文件读写指针到文件头处,然后再将该条信息写入,并接着将全局计数变量的值作为标志位写入该条日志后。这样就可以通过控制最大记录数的大小来控制日志的大小,使日志文件始终只记录所允许的记录的条数,既避免了随着系统运行时间的增长,日志信息的增多而使日志文件占用的磁盘空间过大的情况出现,又可以保证日志文件所记录的日志内容始终为最新的日志信息。
步骤S106、将处理后的所述日志信息按照设定格式写进日志文件形成日志记录;将所述全局计数变量的值转换成字符串,并作为该条记录的标志位写入该条日志记录之后。定位好文件读写指针之后,对接收到的日志信息进行处理,并将处理后的日志信息按照所要求的格式写入日志文件,并在完成此操作后,将全局计数变量写入到此条日志记录后,标志该条记录在日志文件中所对应的序号,同时也为下次打开日志文件进行读写指针的定位提供标志。
在优选的实施方式中,本发明方法还包括:
步骤S107、将文件读写指针向前移动,移动长度的大小为所述字符串长度的大小。写入操作完成后,将文件读写指针相对当前读写位置向前移动,移动的大小为该标志位的长度。这样,当进行下一条记录的写入时,便可以覆盖掉上一次所写入的标志位。指针移动完成后,则该条日志信息处理结束,可以继续下一条消息的接收处理。
其中,所述步骤S102将日志信息从消息队列发送到接收缓冲区、定义指针的过程包括以下步骤:
所述消息队列接收日志信息;然后,所述消息队列将日志信息按优先级从高到低的顺序发送到接收缓冲区;再根据所述日志信息的类型定义一个该类型的指针,并将所述指针指向接收缓冲区。其中,日志信息的优先级由发送日志的任务的优先级决定,消息队列判断该条日志的优先级,并将具有最高优先级的任务所发送的日志信息提前发送。
在本发明中,通过消息队列来完成日志的接收和发送。利用消息队列的特性,可以对发送到日志任务的消息进行缓冲,避免造成日志信息的丢失,还可以避免发送日志的任务进行等待或长时间占用cpu资源,影响进程间的同步和调度。
消息队列的工作模式一般为先入先出模式,在优选的实施例中,可以通过设置消息队列的工作模式为基于优先级的模式来优先记录高优先级的日志信息。日志信息的优先级由发送该日志信息的任务的优先级来决定,消息队列在发送日志信息之时先检查队列中所有信息的优先级,把优先级高的日志信息先发送出去,避免造成重要日志信息的丢失。
在优选的实施例中,还可以将日志信息上报到远程操作维护终端,通过设置日志信息的级别来使日志任务只上报指定级别的日志信息到远程的操作维护终端,或只打印指定级别的日志信息到本地维护终端,使日志的分析工作更有目的性,更简单、准确、明了,更有助于远程调试和故障诊断。在接收到日志信息后,检查日志上报的等级设置,并根据所述检查结果和该日志信息的上报级别及所属模块判断是否需要上报到远程操作维护终端,如果是,则将所述日志信息上报到远程操作维护终端,再将全局计数变量值加一并检测当前的全局计数变量值是否大于最大记录条数值;否则直将全局计数变量值加一并检测当前的全局计数变量值是否大于最大记录条数值。
在步骤S101之前,一般还需要进行日志任务初始化的过程,主要包括以下步骤:
步骤S201、初始化消息队列和全局计数变量;
步骤S202、检测日志文件是否存在,如果是,则继续执行步骤S203;否则,创建日志文件,再执行步骤S203;
步骤S203、查找所述日志文件的标志位并赋值给所述全局计数变量:其中,该标志位所含数据信息为该标志位的前一日志记录在该日志文件中的序号,实际上相当于将该序号赋给全局计数变量;
步骤S204、将文件读写指针移动至所述日志记录之后。
主程序开启日志任务后,日志任务首先初始化消息队列和全局计数变量,然后打开日志文件。若日志文件不存在,则创建日志文件;若日志文件存在,则查找标志位,则标志位前的那条记录便为设备上一次运行时的最后一条日志记录。读出该条记录在该日志文件中的序号并赋值给全局计数变量,然后移动文件读写指针到该条记录后。完成以上操作后,日志任务初始化完成,准备从消息队列中接收其它任务发送过来的日志信息。
在优选的实施例中,本发明还可以根据需要将日志文件上传到远程操作维护终端,上报过程包括以下步骤:
步骤301、远程操作维护终端向嵌入式设备发出上报命令。这种上报方式为被动方式:远程操作维护终端通过发送命令给设备,通知设备按指定格式制作文件,设备在接收到此消息后制作相应的文件并上传到远程操作维护终端。
步骤302、嵌入式设备建立上报文件,按照设定格式写入文件头和日志制作时间。
步骤303、从所述日志文件中读取日志记录并写入所述上报文件中。
步骤304、将所述上报文件上传至远程操作维护终端。
需要说明的是,制作好的相应格式的文件可以通过文件传输协议FTP(File Transfer Protocal)上传,也可以通过其它网络方式进行上传,FTP为本发明的优选实施方式。
其中,步骤S303的过程具体包括:首先,打开对应的日志文件,搜索所述标志位,将所述文件读写指针移动到所述标志位之后;然后,依次读取所述日志文件中的日志记录,并将读到的日志记录写入所述上报文件;当读取日志文件的最后一条日志记录之后,将所述文件读写指针移动到日志文件的文件头,继续读取所述日志文件中的日志记录;当再次读取到标志位时,停止读取所述日志文件中的日志记录,上报文件制作完成。此时新文件中的日志信息应该是按照指定格式编排的,以日志产生时间为顺序来存放的,有利于工作人员依据新制作的日志文件进行故障分析和诊断。
这种上报方式为主动方式:日志在某种设定的条件下触发制作日志文件的操作并上传到远程操作维护终端。
实施例:
这里假设设备在运行过程中将会发送两种格式的日志信息:调试消息和异常消息,两种日志信息的数据结构分别为数据结构一和数据结构二。并要求将调试日志信息存储为文本文件a.txt,用来记录设备运行过程的状态信息,需要上报到远程操作维护终端;将异常日志信息按xml文件格式要求存储为xml文件b.xml,用来记录设备运行过程中的异常信息,不需要上报到远程操作维护终端。假设日志文件所允许记录的最大记录数都为5000条。
首先,数据结构一和二定义如下:
数据结构二
另外用于此例的变量定义及注释如下:
1024];//消息队列接收缓冲区
LOG_MSG*pLogTxt=NULL;//调试日志信息指针
EXC_MSG*plogXml=NULL;//异常日志信息指针
Int giNum=0;//全局计数变量
当有日志信息到达时,日志任务首先从消息队列中接收该消息并放到接收缓冲区strBuf中。根据strBuf的第一个字节即数据结构的INT8kind字段来判断该条消息属于哪种类型的日志信息。若是调试消息,则通过指针的强制转换将pLogTxt指针指向strBuf;若是异常消息,则通过指针的强制转换将plogXml指针指向strBuf。这样便可以很方便的获取对应数据结构中的对应字段。
若日志任务收到的是调试消息,则首先检查日志信息的级别设置,并根据检查结果和该条消息的id、level值来判断是否需要上报到远程操作维护终端。若需要上报,则通过socket上报到远端的操作维护终端,然后检查全局计数变量giNum是否达到所允许的最大记录条数;若不需要进行上报,则直接检查全局计数变量giNum的值是否达到所允许的最大记录条数。如果giNum大于该值,则将移动文件读写指针到日志文件头处并将全局计数变量giNum清零后作加一操作;如果giNum不大于该值,则不移动文件读写指针。完成文件读写指针的定位后,将调试消息按照指定格式写入日志文件,并将标志位giNum转换成字符串,写到该条日志记录后。然后将文件读写指针相对当前位置向前移动,移动的大小为该标志位所转换成的字符串的长度。例如,giNum=123,转换成字符串后为“123”。将“123”写入到日志信息后,文件读写指针相对当前读写位置向前移动3个字节的长度。如果giNum=1222,转换成字符串后为“1222”。将“1222”写入到日志信息后,文件读写指针相对当前读写位置向前移动4个字节的长度。这样在记录下一条日志信息时便会覆盖掉本次写入的标志位。指针移动完成后,则该条调试消息处理结束,继续开始下一条消息的接收处理。
若日志任务收到的是异常消息,则直接检查全局计数变量giNum的值是否达到所允许的最大记录数。如果不大于该值,则不移动文件读写指针;如果大于该值,则将移动文件读写指针到日志文件头处并将全局计数变量giNum清零,然后作加一操作;完成文件读写指针的定位后,通过操作pLogXml指针取得该条日志信息中各个字段的值,并根据xml的文件格式要求将这些字段的值写入到日志文件中。然后将标志位giNum转换成字符串,写到该条日志记录后,并将文件读写指针相对当前位置向前移动,移动的大小为该标志位所转换成的字符串的长度。这样在记录下一条日志信息时便会覆盖掉本次写入的标志位。指针移动完成后,则该条异常消息处理结束,继续开始下一条消息的接收处理。
当设备接收到远程操作维护终端发送的日志文件上报命令后,开始制作日志文件并上传。假设要将异常日志制作成c.xml文件并上传到远程操作维护终端。首先新建文件c.xml,按照xml文件的格式写入xml文件头及该日志文件制作时间等相关字段。打开异常日志文件,搜索标志位,并将文件读写指针移动到标志位后。这样该标志位后的第一条记录便为异常日志文件中最早的一条日志记录。依次读取日志文件中的记录并将读到的记录写入文件c.xml。当读到日志文件尾时,移动文件读写指针到文件头,继续读取,直到再次遇到标志位,表明日志文件已读取完成。此时文件c.xml所记录的日志信息应该是以xml文件格式存储,以记录产生的先后为顺序排列的。文件c.xml制作完成后,通过ftp将此文件上传到远程操作维护终端,日志文件制作上传流程完成。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。