程序压缩性日志文件输出方法及装置与流程

文档序号:12747912阅读:200来源:国知局
程序压缩性日志文件输出方法及装置与流程

本发明涉及计算机技术领域,具体公开一种程序压缩性日志文件输出方法及装置。



背景技术:

随着互联网的发展,数据成为一种战略性资源,电子日志使用的领域和频率在不断提高,电子日志文件可以为服务器、工作站、防火墙和应用软件等记录必要的、有价值的信息,因此,对互联网中产生的访问日志的记录、收集和存储成为关键,尤其是日志存储,由于不经压缩的原始日志所占存储空间过大,必须对原始日志进行压缩,才能达到长期保存目的。

现有的技术中,服务器后台程序打印、输出的日志文件中包含了大量重复字段的格式化行信息,使得打印日志文件时占用系统的大量IO资源,影响了程序的运行效率,同时所打印出的日志文件占用大量的存储空间,为了减少磁盘存储空间的占用,通常会定期把日志文件压缩成二进制文件,待将来需要查询时再进行还原、解压,但这无法从根本上解决日志文件体积较大的问题和打印日志文件时所占用的系统大量IO资源的问题。



技术实现要素:

本发明的首要目的在于提供一种程序压缩性日志文件输出方法。

本发明的另一目的在于提供一种程序压缩性日志文件输出装置。

为实现该目的,本发明采用如下技术方案:

一种程序压缩性日志文件输出方法,包括如下步骤:

获取特定时间内所产生的若干条日志数据,每条日志数据包括与其产生时间相对应的日期字段和若干数据项,每个数据项包括若干字段名及相对应的数据;定义所述数据项中的字段名的顺序组合为字段格式化串,定义所述数据项中的数据的顺序组合为数据格式化串;

对于每条日志数据,将其中的日期字段与为本日志文件定义的起始时间字段的时间差值作为压缩后的日期字段表达式,采用预置的为各字段格式化串所分配的特定编号作为压缩后的字段名表达式;所述压缩后的每条日志数据包括其对应的日期字段表达式、字段名表达式以及所述数据格式化串;

将所述特定时间内已压缩的所述日志数据输出到本日志文件中。

具体的,所述日期字段、起始时间字段包括每一条日志数据产生时的年数据、月数据、日数据、小时数据、分钟数据和秒数据的任意一项或多项。

进一步的,压缩日期字段具体包括如下步骤:

将所获取的起始时间字段和每一条日志数据的日期字段转换成数值类型数据;

分别计算每一条日志数据的日期字段与起始时间字段的时间差值并以数值类型数据保存为该条日志数据的日期字段表达式,以完成对日期字段的压缩。

优选的,所述数据项的字段名包括文件名及规范日志的若干格式串。

进一步的,所述方法还包括各字段格式化串所分配的特定编号的预置步骤,具体包括:

建立所述字段格式化串与编号的映射关系;

将所述字段格式化串及其映射关系对应的编号记录、存储在数据库中;

在程序启动时,读取存储于数据库中的各字段格式化串与编号的映射关系至系统内存中,以完成各字段格式化串特定编号的预置。

优选的,所述每条日志数据还包括其对应的日志等级标识。

进一步的,所述压缩后的每一条日志数据还包括其对应的日志等级标识。

更进一步的,所述方法还包括后续步骤:

将完成上述压缩后输出的日志文件定期压缩为二进制文件。

相应地,本发明还提供一种程序压缩性日志文件输出装置,包括:

获取模块:用于获取特定时间内所产生的若干条日志数据,每条日志数据包括与其产生时间相对应的日期字段和若干数据项,每个数据项包括若干字段名及相对应的数据,定义所述数据项中的字段名的顺序组合为字段格式化串,定义所述数据项中的数据的顺序组合为数据格式化串;

压缩模块:用于对于每条日志数据,将其中的日期字段与为本日志文件定义的起始时间字段的时间差值作为压缩后的日期字段表达式,采用预置的为各字段格式化串所分配的特定编号作为压缩后的字段名表达式,所述压缩后的每条日志数据包括其对应的日期字段表达式、字段名表达式以及所述数据格式化串;

输出模块:用于将所述特定时间内已压缩的所述日志数据输出到本日志文件中。

与现有技术相比,本发明具备如下优点:

首先,本发明为每个日志文件定义了一个日志起始时间字段,将特定时间内记录的每一条日志数据的日期字段转化为与起始时间字段的时间差值作为压缩后的日期字段表达式,通过共用时间字段,用相对时间值替换绝对时间值来压缩日志数据中的日期字段。

其次,本发明为日志数据中的诸多不同字段格式化串分配特定的编号,将特定时间内记录的每一条日志数据中的字段格式化串转化为相对应的编号,以编号的形式替换一长串的字段格式化串,以达到压缩字段格式化串的效果。

再者,本发明维持定期压缩日志文件为二进制文件的功能不变,将日志文件进行全面压缩。

最后,在后续需要阅读日志文件时,按照本发明的压缩逻辑可将日志文件中的每一条日志数据还原成其原有的形式。

综上所述,本发明通过替换日志数据中存在的大量重复字段的格式化行信息,实现日志数据的实时压缩效果,减少在输出、打印日志文件时所占用的系统IO资源,并且减少了打印出的特定时间内的日志文件所占用的存储空间,使得服务器能保留更多的最近一段时间的日志数量,提高了程序的运行效率。

显然,上述有关本发明优点的描述是概括性的,更多的优点描述将体现在后续的实施例揭示中,以及,本领域技术人员也可以本发明所揭示的内容合理地发现本发明的其他诸多优点。

本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。

【附图说明】

图1为本发明一种程序压缩性日志文件输出方法的一实施例流程示意图。

图2为一种实施例的输出压缩前的一万条日志数据,只列出前10条的示意图。

图3为一种实施例的以本发明所述方法压缩后输出的一万条日志数据,只列出前10条的示意图。

图4为本发明一种程序压缩性日志文件输出装置的一实施例示意图。

【具体实施方式】

下面结合附图和示例性实施例对本发明作进一步地描述,其中附图中相同的标号全部指的是相同的部件。此外,如果已知技术的详细描述对于示出本发明的特征是不必要的,则将其省略。

本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。

本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。

日志是网络设备、系统及服务程序等在运行时产生的一个叫log的事件记录,每一条日志数据都记载着日期、时间、使用者及动作等相关操作的描述信息,日志记录了系统的生命周期,通过查阅日志,可以了解到系统在某个时刻所处的状态,通过对日志的分析,收集有用的数据,可以得到用户的使用信息和访问统计,为服务系统的优化和网络安全问题预防等提供依据。

如图1所示,本发明程序压缩性日志文件输出方法的一个实施例流程示意图,包括如下步骤:

步骤S100:获取特定时间内所产生的若干条日志数据,每条日志数据包括与其产生时间相对应的日期字段和若干数据项,每个数据项包括若干字段名及相对应的数据,定义所述数据项中的字段名的顺序组合为字段格式化串,定义所述数据项中的数据的顺序组合为数据格式化串。

本发明中,服务器后台程序规定了输出、打印一个日志文件的时间间隔,因综合考虑打印日志文件时所需占用的系统IO资源,可以规定每小时或每两个小时或其他时间间隔将这段时间内所记录的日志数据输出为一个日志文件至磁盘中。

所述每一条日志数据包括与其产生时间相对应的日期字段和若干数据项,每个数据项包括了若干字段名及相对应的数据,优选地,还包括每一条日志数据其对应的日志等级标识。

服务器后台程序打印日志文件时,一般采用格式化输出的方式,以JAVA代码为例,一段记录用户信息的代码如下:

log(Info,"GetUserInfo uid%d name%s phone%s email%s",uid,name,phone,emai);

其中“log”可以是一个函数,也可以是宏定义,将真实的打印日志函数(MyLog)封装起来,以方便将文件名(_FILE_)作为隐藏参数一并传入并打印,log函数中封装了String.format来完成格式化,并获取当前时间、进程号、文件名等信息作为日志的通用字段连同log中传入的参数一起输出、打印为日志文件;其中“Info”为日志等级标识,一般日志可分为FATAL、ERROR、WARN、INFO、DEBUG等几种等级;“GetUserInfo uid%d name%s phone%s email%s”表示了记录用户的哪些数据及这些数据的存储格式,“uid,name,phone,emai”为待传入的参数。

如图2所示是一种实施例用测试程序输出上述代码所记录的一万条日志数据至一个日志文件中,输出结果只列出前10条的示意图,以其中的一条日志数据“2016-06-24 18:36:00.799925Info test1.cpp GetUserInfo uid 0name name_0phone phone_0email email_0@test.com”为例进行说明,其中“2016-06-24 18:36:00.799925”为该条日志数据记录时间所对应的日期字段,其包含了年数据、月数据、日数据、小时数据、分钟数据和秒数据,“Info”为该条日志数据的日志等级,“test1.cpp GetUserInfo uid 0name name_0phone phone_0email email_0@test.com”为记载相关信息的若干数据项,其中包括文件名“test1.cpp”和规范日志的格式串“GetUserInfo uid name phone email”等字段名,及“0name_0phone_0email_0@test.com”等参数数据,定义数据项中的字段名(即文件名及规范日志的格式串)的顺序组合为字段格式化串,定义数据项中的数据的顺序组合为数据格式化串。

步骤S200:对于每条日志数据,将其中的日期字段与为本日志文件定义的起始时间字段的时间差值作为压缩后的日期字段表达式,采用预置的为各字段格式化串所分配的特定编号作为压缩后的字段名表达式,所述压缩后的每条日志数据包括其对应的日期字段表达式、字段名表达式以及所述数据格式化串。

首先定义每个日志文件的起始时间字段,起始时间字段对应的时间为以所述特定时间作为时间间隔的时间段的开始时间,如果程序规定了每小时输出一个日志文件,则可以以整点时刻作为每个日志文件的起始时间字段,亦可以规定其他时刻作为每个日志文件的起始时间字段,本发明对此不作限定。然后对日志数据的日期字段进行压缩,将原日志数据的日期字段与本日志文件的起始时间字段的时间差值作为压缩后的日期字段表达式,若以每小时输出一个日志文件为例,该时间差值不超过3600秒。

具体的,压缩日期字段包括如下步骤:

将所获取的起始时间字段和每一条日志数据的日期字段转换成数值类型数据;分别计算每一条日志数据的日期字段与起始时间字段的时间差值并以数值类型数据保存为该条日志数据的日期字段表达式,以完成对日期字段的压缩。

日志数据中记录的日期字段以字符串的形式记录,例如一条日志数据的日期字段为“2016-06-24 18:36:00.799925”,该条日志数据对应的日志文件的起始日期字段为“2016-06-24 18:00:00.000000”。

一种实施方式为,若假定程序每小时生成一个日志文件,则将日期字段、起始时间字段中的年数据、月数据、日数据、小时数据转化为数值类型数据且数值保持不变,将字段中的分钟数据转化成数值类型且数值乘60并与原秒数据转化成的数值类型数值相加,如上述的起始时间字段转化后为“20160624180000.000000”的数值类型数据,上述的日期字段转化后为“20160624182160.799925”的数值类型数据,两者的差值为2160.799925,将该差值作为该条日志数据压缩后的日期字段表达式。

另一种实施方式为,若假定程序以大于1小时而小于24小时的时间间隔输出一个日志文件,则将日期字段、起始时间字段中的年数据、月数据、日数据转化为数值类型数据且数值保持不变,将字段中的小时数据转化成数值类型且数值乘3600、分钟数据转化成数值类型且数值乘60并与原秒数据转化成的数值类型数值相加,则上述的日期字段转化后为“20160624066960.799925”的数值类型数据,则上述的起始时间字段转化后为“20160624064800.000000”的数值类型数据,两者的差值亦为2160.799925,将该差值作为该条日志数据压缩后的日期字段表达式。

进一步地,压缩字段格式化串具体包括如下步骤:

建立所述字段格式化串与编号的映射关系;

将所述字段格式化串及其映射关系对应的编号记录、存储在数据库中;

在程序启动时,读取存储于数据库中的各字段格式化串与编号的映射关系至系统内存中,以完成各字段格式化串特定编号的预置;

利用预置的为各字段格式化串所分配的特定编号作为压缩后的字段名表达式。

所述字段格式化串为数据项中字段名包括的文件名及规范日志的格式串的顺序组合,以文件名及规范日志的格式串作为联合主键,以递增的形式为每一个不同的字段格式化串分配全局唯一编号,并以(文件名,格式串,编号)三元组的记录形式将其记录、存储到数据库中。例如将上述“test1.cpp,GetUserInfo uid name phone email”的字段格式化串分配全局唯一编号~L1,将另一诸如“test1.cpp,GetUserInfo uid name phone email address”的字段格式化串分配全局唯一编号~L2等,本发明对所分配的唯一编号的形式不作限定。

为了提高程序运行效率,在程序启动时,将数据库中所记录的字段格式化串与编号的映射关系读取到内存中,形成(文件名,格式串)->编号的映射,实现字段格式化串编号的预置,在每一条日志数据写入日志文件时,将其中的格式化串转化成对应的编号,以编号作为每一条日志数据压缩后的字段名表达式,以实现对字段格式化串的压缩。

更进一步地,所述数据项中的数据的顺序组合定义为数据格式化串,可将诸如上述“0name_0phone_0email_0@test.com”的数据格式化串转化为“n0p0e0@t.com”形式的数据格式化串,因日志记录的数据多种多样,亦可保留原来形式的数据格式化串。

至此,压缩后的每一条日志数据包括了其对应的日期字段表达式、日志等级标识、字段名表达式及所述数据格式化串。

步骤S300:将所述特定时间内已压缩的所述日志数据输出到本日志文件中。

程序规定了输出日志的时间间隔,该时间间隔内的每一条日志数据经压缩后写入日志文件中,在该时间间隔的结束时刻,将该段时间间隔内的所有压缩后的日志数据的输出为一个日志文件。如图3所示,是一种实施例的一万条日志数据压缩后(仅列出前10条)的结果示意图,其规定的日志文件的起始时间字段为“2016-06-24 23:35:23.737556”,在未经压缩前,该一万条日志的日志文件大小为0.98M,在并发量大的情况下(假设每秒产生一万条日志数据),则系统的IO为0.98M/s,该数值偏大,经压缩后相同的一万条日志数据的日志文件大小为405KB,仅为原来的40%,在输出日志文件时有效地减少了所占用的系统IO资源。

在上述日志压缩的基础上,可以维持定期压缩日志文件为二进制文件的功能不变。为减少磁盘空间占用,一般会定期把日志文件压缩成二进制文件,该步骤比较占用CPU资源,为了避免程序运行,通常在凌晨时进行该步骤,。

在将日志文件完成压缩、保存后,日志文件的阅读会变得相对困难,在日后需要阅读已压缩的日志文件,可按本发明所述压缩逻辑将其还原成其原有的格式化串形式。

相应地,本发明还提供一种程序压缩性日志文件输出装置,包括:

获取模块:用于获取特定时间内所产生的若干条日志数据,每条日志数据包括与其产生时间相对应的日期字段和若干数据项,每个数据项包括若干字段名及相对应的数据,定义所述数据项中的字段名的顺序组合为字段格式化串,定义所述数据项中的数据的顺序组合为数据格式化串。

本发明中,服务器后台程序规定了输出、打印一个日志文件的时间间隔,因综合考虑打印日志文件时所需占用的系统IO资源,可以规定每小时或每两个小时或其他时间间隔将这段时间内所记录的日志数据输出为一个日志文件至磁盘中。

获取模块获取的所述每一条日志数据包括与其产生时间相对应的日期字段和若干数据项,每个数据项包括了若干字段名及相对应的数据,优选地,还包括每一条日志数据其对应的日志等级标识,定义数据项中的字段名(即文件名及规范日志的格式串)的顺序组合为字段格式化串,定义数据项中的数据的顺序组合为数据格式化串

压缩模块:用于对于每条日志数据,将其中的日期字段与为本日志文件定义的起始时间字段的时间差值作为压缩后的日期字段表达式,采用预置的为各字段格式化串所分配的特定编号作为压缩后的字段名表达式,所述压缩后的每条日志数据包括其对应的日期字段表达式、字段名表达式以及所述数据格式化串。

首先定义每个日志文件的起始时间字段,起始时间字段对应的时间为以所述特定时间作为时间间隔的时间段的开始时间,如果程序规定了每小时输出一个日志文件,则可以以整点时刻作为每个日志文件的起始时间字段,亦可以规定其他时刻作为每个日志文件的起始时间字段,本发明对此不作限定。然后对日志数据的日期字段进行压缩,将原日志数据的日期字段与本日志文件的起始时间字段的时间差值作为压缩后的日期字段表达式,若以每小时输出一个日志文件为例,该时间差值不超过3600秒。

进一步地,压缩模块对日志数据中的字段格式化串进行压缩,包括如下步骤:

建立所述字段格式化串与编号的映射关系;

将所述字段格式化串及其映射关系对应的编号记录、存储在数据库中;

在程序启动时,读取存储于数据库中的各字段格式化串与编号的映射关系至系统内存中,以完成各字段格式化串特定编号的预置;

利用预置的为各字段格式化串所分配的特定编号作为压缩后的字段名表达式

所述字段格式化串为数据项中字段名包括的文件名及规范日志的格式串的顺序组合,以文件名及规范日志的格式串作为联合主键,以递增的形式为每一个不同的字段格式化串分配全局唯一编号,并以(文件名,格式串,编号)三元组的记录形式将其记录、存储到数据库中。

为了提高程序运行效率,在程序启动时,将数据库中所记录的字段格式化串与编号的映射关系读取到内存中,形成(文件名,格式串)->编号的映射,实现字段格式化串编号的预置,在每一条日志数据写入日志文件时,压缩模块将其中的格式化串转化成对应的编号,以编号作为每一条日志数据压缩后的字段名表达式,实现对字段格式化串的压缩。

更进一步地,所述数据项中的数据的顺序组合定义为数据格式化串,因日志记录的数据多种多样,亦可保留原来形式的数据格式化串,至此,压缩后的每一条日志数据包括了其对应的日期字段表达式、日志等级标识、字段名表达式及所述数据格式化串。

输出模块:用于将所述特定时间内已压缩的所述日志数据输出到本日志文件中。

程序规定了输出日志的时间间隔,该时间间隔内的每一条日志数据经压缩后写入日志文件中,在该时间间隔的结束时刻,输出模块将该段时间间隔内的所有压缩后的日志数据的输出为一个日志文件。

本发明通过替换日志数据中存在的大量重复字段的格式化行信息,具体地,通过共用时间字段,用相对时间值替换绝对时间值来压缩日志数据中的日期字段,再以编号的形式替换一长串的字段格式化串,实现日志数据的实时压缩效果,减少了程序输出日志文件时所占用的IO资源,同时也节省了大量日志文件所占用的存储空间,提高程序的运行效率。

虽然上面已经示出了本发明的一些示例性实施例,但是本领域的技术人员将理解,在不脱离本发明的原理或精神的情况下,可以对这些示例性实施例做出改变,本发明的范围由权利要求及其等同物限定。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1