一种日志生成方法及系统与流程

文档序号:11154215阅读:381来源:国知局
一种日志生成方法及系统与制造工艺
本发明涉及数据处理
技术领域
,特别涉及一种日志生成方法及系统。
背景技术
:应用程序或服务端程序在运行时,由于业务的复杂及问题排查或业务日志记录等都需要实时的向文件中写入特殊的日志信息。所以程序的日志记录是生产环境中必需要用到的基本技术。它有助于问题的排查及系统状态的展示等作用。对于小批量日志输出,无论用什么方法都基本够用。但是一旦程序是复杂的,而且性能要求极高,又必须输出大量日志信息时。那常规的日志记录反而会影响正常的业务程序运行。目前,日志记录方法可以包括常规方法,通过网络推送日志,加装固态硬盘方法这三种。其中,常规方法:就是在需要输出日志的代码行中,对磁盘IO进行直接操作,将程序中的特殊信息组成一个字符串写入到磁盘中。通过网络推送日志:通过网络如UDP协议,将日志数据推送给一台或多台电脑后,异步的将日志数据写入磁盘中。加装固态硬盘方法:通过加装固态硬盘来提升IO性能,达到写日志性能的提升。但是上述各种方法都存在对应的缺点。其中,常规方法:没有采取任务优化措施,在系统进行大量日志输出时,会因为写日志性能过慢而影响正常的业务处理性能。反而会因为日志量过大而影响生产。所以往往会将日志根据条件进行简化输出,但简化输出后,往往得不到详细的日志数据。一旦出问题。排查问题异常困难。而大量的日志记录则会占据太多的资源。通过网络推送日志:在系统进行大量日志输出时,会造成网络拥堵。影响正常网络通讯,甚至日志信息会由于网络忙而丢失。加装固态硬盘方法:此方法需要依靠硬件支撑,费用贵,且容量小,对于需要记录大量日志的场景下,会因为容量小而失去应用价值。因此,如何在不改变现有硬件的条件下,以极高性能向外输出大量日志而又不影响程序的性能,是本领域技术人员需要解决的技术问题。技术实现要素:本发明的目的是提供一种日志生成方法及系统,在写日志时将程序中的字符常量提前提取,在后续能够减少对字符数据的操作,可以提升性能并减少了日志文件大小。为解决上述技术问题,本发明提供一种日志生成方法,包括:利用日志预处理工具对预定源码文件进行扫描,检测是否存在WriteLog关键字;当检测到WriteLog关键字时,提取对应的日志描述信息参数中的字符并存储到日志字符数据映射文件中,同时生成一个唯一的ID值并将所述ID值替代到所述日志描述信息参数中的字符,形成新的源码文件;将所述新的源码文件进行编译生成目标代码进行发布运行,生成二进制日志文件。可选的,所述生成二进制日志文件,包括:根据所述新的源码文件中WriteLog传入的参数顺序进行二进制流化处理,生成二进制数据流;根据所述二进制数据流生成二进制日志文件。可选的,根据所述二进制数据流生成二进制日志文件,包括:将所述二进制数据流直接插入到缓存队列中;日志写入线程逐条取出缓存队列中的二进制数据流,并将其写入到磁盘中生成二进制日志文件。可选的,所述WriteLog的参数包括日志级别参数、日志描述信息参数和变量数组参数。可选的,本方案还包括:对所述预定源码文件增加版本标识,并对所述预定源码文件对应的所述日志字符数据映射文件增加相同的版本标识。可选的,本方案还包括:根据所述二进制日志文件和所述日志字符数据映射文件,利用日志文件解释器解析输出可读日志文件。可选的,根据所述二进制日志文件和所述日志字符数据映射文件,利用日志文件解释器解析输出可读日志文件,包括:获取所述二进制日志文件以及对应的所述日志字符数据映射文件;依次读取所述二进制日志文件中的数据;解析所述数据中各个参数值,并根据所述日志描述信息参数值从所述日志字符数据映射文件中获取对应的字符串;利用Format函数,根据所述字符串以及各个所述参数值,生成目标日志字符信息,形成可读日志文件并输出。本发明还提供一种日志生成系统,包括:扫描模块,用于利用日志预处理工具对预定源码文件进行扫描,检测是否存在WriteLog关键字;替换模块,用于当检测到WriteLog关键字时,提取对应的日志描述信息参数中的字符并存储到日志字符数据映射文件中,同时生成一个唯一的ID值并将所述ID值替代到所述日志描述信息参数中的字符,形成新的源码文件;编译模块,用于将所述新的源码文件进行编译生成目标代码进行发布运行,生成二进制日志文件。可选的,所述编译模块,包括:二进制流化处理单元,用于根据所述新的源码文件中WriteLog传入的参数顺序进行二进制流化处理,生成二进制数据流;二进制日志文件生成单元,用于根据所述二进制数据流生成二进制日志文件。可选的,本方案还包括:解析模块,用于根据所述二进制日志文件和所述日志字符数据映射文件,利用日志文件解释器解析输出可读日志文件。本发明所提供的一种公开了日志生成方法,包括:利用日志预处理工具对预定源码文件进行扫描,检测是否存在WriteLog关键字;当检测到WriteLog关键字时,提取对应的日志描述信息参数中的字符并存储到日志字符数据映射文件中,同时生成一个唯一的ID值并将ID值替代到日志描述信息参数中的字符,形成新的源码文件;将新的源码文件进行编译生成目标代码进行发布运行,生成二进制日志文件;可见,该方法在写日志时将程序中的字符常量提前提取,在后续能够减少对字符数据的操作,可以提升性能并减少了日志文件大小,且减轻了IO负担;本发明还提供了一种日志生成系统,具有上述有益效果,在此不再赘述。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。图1为本发明实施例所提供的日志生成方法的流程图;图2为本发明实施例所提供的日志生成方法的流程示意图;图3为本发明实施例所提供的日志生成系统的结构框图。具体实施方式本发明的核心是提供一种日志生成方法及系统,在写日志时将程序中的字符常量提前提取,在后续能够减少对字符数据的操作,可以提升性能并减少了日志文件大小。为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。本实施例提供的方法可以在程序运行中以极高性能向外输出大量日志而又不影响程序的性能。且在相同日志信息量下又可以比传统日志记录方法极大的减少日志文件的大小。具体请参考图1,图1为本发明实施例所提供的日志生成方法的流程图;该方法可以包括:S100、利用日志预处理工具对预定源码文件进行扫描,检测是否存在WriteLog关键字;S110、当检测到WriteLog关键字时,提取对应的日志描述信息参数中的字符并存储到日志字符数据映射文件中,同时生成一个唯一的ID值并将所述ID值替代到所述日志描述信息参数中的字符,形成新的源码文件;具体的,这两个步骤主要实现写日志时,尽量减少对字符数据的操作,从而可以提高日志生成性能。即在编码完成后,将代码(即预定源码文件)中的日志描述信息参数对应的字符都抽取出来存入独立的日志字符数据映射文件中,同时对抽取的每一条字符进行唯一编码,并将此码替换到日志代码的字符串位置,完成预定源码文件中全部WriteLog关键字处的替换后,形成新的源码文件。其中,WriteLog的参数包括日志级别参数、日志描述信息参数和变量数组参数。在对预定源码文件进行重新编译前,需要对WriteLog函数(即WriteLog)进行一些规范和约束。例如:日志输出函数约定如:WriteLog(iLeve:integer;constFormat:string;constArgs:arrayofconst)。其中,iLeve参数表示日志级别,通过它根据系统参数的当前设定级别决定此行日志是否需要被记录。Format参数是此行日志的描述信息,即一行可被Format的字符串参数。可以包含type参数,如%d、%f、%s等。Args是一个变量数组,即它里面可以有多个参数,而且每个参数可以不同。代码编写完成后,需要使用日志预处理工具对代码中的WriteLog进行预处理。将sExplain传入的字符生成日志字符数据映射文件。下面通过编程处理举例具体说明上述过程:程序员在代码中需要输出日志处,使用约定的WriteLog函数及参数规范进行日志输出。例如以下代码片段即预定源码文件:当程序员把所有的代码编写完成后,接下来就是使用日志预处理工具对代码中涉及到日志输出的进行预处理。日志预处理工具的处理逻辑很简单,即对所有的源码文件进行扫描(可以是逐条扫描),当检测到WriteLog关键字时,自动将日志描述信息参数中的字符抽取并追加到日志字符数据映射文件中,同时生成一个唯一ID值替代到当前代码中日志描述信息参数中的字符处。例如以上的代码被处理后会如下即形成了新的源码文件:WriteLog(1,1,Stream.Size)//日志输出1ifStream.Size>0thenbeginWriteLog(1,2,SizeOf(ZlibCount))//日志输出2Stream.Position:=0;Stream.ReadBuffer(ZlibCount,SizeOf(ZlibCount));GetMem(Buffer,ZlibCount);UnZipStream:=TDecompressionStream.Create(Stream);TryUnZipStream.ReadBuffer(Buffer^,ZlibCount);Result.WriteBuffer(Buffer^,ZlibCount);Result.Position:=0;FinallyWriteLog(1,3,UnZipStream.SizeOf)//日志输出3UnZipStream.Free;FreeMem(Buffer);end;end;通过代码中加粗字体可以得到日志字符数据映射文件中包含:“1=当前Stream流的大小=%d”,“2=获取原始流大小=%d”,“3=处理完毕UnZipStream=%d”。S120、将所述新的源码文件进行编译生成目标代码进行发布运行,生成二进制日志文件。具体的,日志输出时,将程序中的字符常量提前提取,那么在后续的处理可以提升性能并减少了日志文件大小(因为在程序的运行中,同一行日志会被反复输出,但较长的字符已经被抽出,所以很大程序上减少了文件大小并提升了性能)。由于目前常用的日志输出操作都离不开类似Format功能的,需要对字符串进行拼接转换成一串字符串后才保存到磁盘文件中。而字符串的操作在计算中是相当耗时的,它是影响程序性能的主要原因。因此为了规避日志输出的字符串操作。将耗时耗性能的字符串操作交给其它设备按需的去处理。从而进一步提高日志生成的性能。即不对日志信息进行直接的拼接,例如:Writelog(“输出日志%d”,123)传统做法是在代码中,将123的值替入到日志数据”输出日志%d”的%d位置。但本实施例将不再做此操作,而是将日志参数按顺序保存即可。由于程序中写入到磁盘中的日志数据都是直接采用二进制流化进行存储,即得到的是二进制日志文件。其并没有像传统的方法那样,需要将日志数据都转为可以读懂的字符串进行存储。所以直接打开日志文件,是无法读懂内部记录的内容。所以需要在后期借助此日志分析工具来完成日志分析及问题排查等工作。实现将耗时的日志字符拼接与生成排除在当前运行环境内。而是可以使用其它机器资源或任意时间去解析日志文件。对计算资源占用做到了巧妙的转移。即规避了日志输出时类似Format的耗时的字符串操作。(本发明在日志数据存储时,不需要在运行时进行耗时费性能的拼接字符串)。因此,优选的,所述生成二进制日志文件可以包括:根据所述新的源码文件中WriteLog传入的参数顺序进行二进制流化处理,生成二进制数据流;根据所述二进制数据流生成二进制日志文件。具体的,流化处理:根据传入的参数顺序将它们直接进行二进制流化处理。例如每个参数的存储格式如下:变量类型(1:整型2:浮点型3:字符型)长度变量值例如:WriteLog(1,2,SizeOf(ZlibCount))假设SizeOf(ZlibCount)的值为100内部将其处理为二进制流如表一所示,根据上述二进制流表中二进制数据可以生成二进制日志文件。表1二进制流表偏移地址存入的值字节长度含义说明0000H34字节WriteLog的参数个数0004H14字节变量类型0008H44字节当前变量值的长度信息000cH14字节存入WriteLog中的参数1的值0010H14字节变量类型0014H44字节当前变量值的长度信息0018H24字节存入WriteLog中的参数2的值001cH14字节变量类型0020H44字节当前变量值的长度信息0024H1004字节存入WriteLog中的参数3的值进一步为了提高IO效率,本实施例在写日志时,不直接写入磁盘,由于磁盘IO的速度是比较慢的,所以先写入到预分配好的内存中,再异步写入磁盘。具体的,根据所述二进制数据流生成二进制日志文件可以包括:将所述二进制数据流直接插入到缓存队列中;日志写入线程逐条取出缓存队列中的二进制数据流,并将其写入到磁盘中生成二进制日志文件。具体的,日志输出时只是将原始参数直接进行二进制流保存,无需额外的字符拼接等处理,同时也不需要处理效率低下的Format函数。所以在二进制日志文件记录时,性能是有极大的提升的。请参考图2,图2给出了多个预定源码文件(图2中指业务代码)生成日志的流程示意图。各个业务代码之间可以并行运行。都将各自的业务代码进行WriteLog关键字扫描,并对生成的目标代码进行流化处理,得到二进制流,并通过高速缓存队列异步读取二进制流数据到磁盘中。基于上述技术方案,本发明实施例提供的日志生成方法,在写日志时将程序中的字符常量提前提取,在后续能够减少对字符数据的操作,可以提升性能并减少了日志文件大小,且减轻了IO负担。由于在对预定源码文件进行编译形成新的源码文件的过程会形成日志字符数据映射文件。根据上述各实施例的描述可以看到这个日志字符数据映射文件与预定源码文件是一一对应的。因此,必须保证这两个文件的统一。可以通过生成相同的代号(例如一对文件对应的代码数字相同),也可以通过增加标识来识别相同的文件等。本实施例并不对此进行限定。进一步为了提高可靠性,优选的,基于上述任意实施例,该方法还可以包括:对所述预定源码文件增加版本标识,并对所述预定源码文件对应的所述日志字符数据映射文件增加相同的版本标识。具体的,由于生成的“日志字符数据映射文件”是需要结合当前目标代码的,因此需要做相应的版本功能,不能混淆映射文件。这里可以是直接对预定源码文件增加版本标识,从而尤其生成的新的源码文件以及对应的编译后的目标代码都会具有该版本标识。或者是直接对目标代码增加版本标识。由于二进制日志文件中保存的并不是最终的日志信息,它类似于是一种原始格式的日志数据。因此它不能被直接阅读。所以需要提供一个日志文件解释器。根据特定算法将二进制日志文件结合日志字符数据映射文件,进行最终的日志输出。进而得到可读日志文件。为了提高系统效率,此解析过程是不需要现场去做的。因此它不影响实际的生产环境的业务运行。即基于上述任意实施例,该方法还可以包括:根据所述二进制日志文件和所述日志字符数据映射文件,利用日志文件解释器解析输出可读日志文件。具体的,由于上述各实施例中对预定源码文件进行重新编译后形成新的源码文件以及日志字符数据映射文件,因此最终生成的日志文件具有一定保密性,其必须获取到日志字符数据映射文件才能够对二进制日志文件进行解析,生成可读日志文件。即将新的源码文件进行编译生成最终的目标代码进行发布运行,并将生成的日志字符数据映射文件提供给日志分析工具使用。可选的,根据所述二进制日志文件和所述日志字符数据映射文件,利用日志文件解释器解析输出可读日志文件可以包括:获取所述二进制日志文件以及对应的所述日志字符数据映射文件;依次读取所述二进制日志文件中的数据;解析所述数据中各个参数值,并根据所述日志描述信息参数值从所述日志字符数据映射文件中获取对应的字符串;利用Format函数,根据所述字符串以及各个所述参数值,生成目标日志字符信息,形成可读日志文件并输出。具体的,从日志文件流中,按条取出参数。通过参数(Format)中的ID值,即可从日志字符数据映射文件中获取到程序中原始的日志输出的提示信息。然后再根据其它参数,即可以代入到当前字符串中的type参数,最终形成一条可以被读的懂的日志信息。由于本实施例在编码阶段就已经将日志输出时的字符串统一抽取出去,自然就减少了耗时的字符串操作,同时程序代码中并不需要调用耗时的Format语句对字符串进行拼接操作。而且日志的输出是直接使用二进流方式写入到内存缓存中。因此本实施例中日志的大量输出性能是极高的,即使在大量日志输出的情况下也几乎不会影响业务代码的运行,由于日志文件中的大量字符串已经不存在了,所以输出的文件比原来的要小很多,减少了磁盘的IO操作。同时日志还具备一定的保密性。基于上述技术方案,本发明实施例提的日志生成方法,在不改变现有硬件的条件且在高性能大并发运行的程序中需要输出大量日志信息时,能够用极少的资源占用来达到高性能的日志记录。同时它所占用的磁盘空间会更小而且对业务程序代码的运行性能影响极小。同时,生成的日志信息还具有一定的保密性。下面对本发明实施例提供的日志生成系统进行介绍,下文描述的日志生成系统与上文描述的日志生成方法可相互对应参照。请参考图3,图3为本发明实施例所提供的日志生成系统的结构框图;该系统可以包括:扫描模块100,用于利用日志预处理工具对预定源码文件进行扫描,检测是否存在WriteLog关键字;替换模块200,用于当检测到WriteLog关键字时,提取对应的日志描述信息参数中的字符并存储到日志字符数据映射文件中,同时生成一个唯一的ID值并将所述ID值替代到所述日志描述信息参数中的字符,形成新的源码文件;编译模块300,用于将所述新的源码文件进行编译生成目标代码进行发布运行,生成二进制日志文件。可选的,所述编译模块300可以包括:二进制流化处理单元,用于根据所述新的源码文件中WriteLog传入的参数顺序进行二进制流化处理,生成二进制数据流;二进制日志文件生成单元,用于根据所述二进制数据流生成二进制日志文件。基于上述任意实施例,该系统还可以包括:标识模块,用于对所述预定源码文件增加版本标识,并对所述预定源码文件对应的所述日志字符数据映射文件增加相同的版本标识。基于上述任意实施例,该系统还可以包括:解析模块,用于根据所述二进制日志文件和所述日志字符数据映射文件,利用日志文件解释器解析输出可读日志文件。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或
技术领域
内所公知的任意其它形式的存储介质中。以上对本发明所提供的一种日志生成方法及系统进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1