1.本技术涉及信息技术领域,特别是涉及一种日志压缩的保存方法、装置、电子设备及存储介质。
背景技术:2.目前,在应用的使用过程中,往往根据用户的使用信息生成日志数据。从而便于用户查看历史数据,或在应用出现故障时,根据日志分析故障原因,以及根据日志对应用进行更新和改进。
3.然而,目前在存储日志时,虽然会对日志数据进行压缩,但是由于日志的存储空间一定,即使日志数据被压缩了,随着日志数据的增多,最终也还是会占满整个存储空间,导致新的日志文件无法存储。
技术实现要素:4.本技术实施例的目的在于提供一种日志压缩的保存方法、装置、电子设备及存储介质,以实现日志数据的保存。具体技术方案如下:
5.本技术实施例的第一方面,提供了一种日志压缩的保存方法,包括:
6.获取待保存的日志数据;
7.识别日志文件中预先保存的日志循环队列中的写指针;
8.将所述待保存的日志数据写入所述日志文件中写指针所指向的位置。
9.可选的,所述识别日志文件中预先保存的日志循环队列中的写指针之前,所述方法还包括:
10.创建日志文件,并将该日志文件的属性信息写入自身,其中,所述属性信息包括所述日志文件的标识、所述日志文件预先分配的空间大小。
11.可选的,所述识别日志文件中预先保存的日志循环队列中的写指针之前,所述方法还包括:
12.读取所述日志文件的属性信息;
13.当未读取到所述日志文件的属性信息,或所述日志文件的标识与预设标识不一致,或所述日志文件的空间大小与预设信息不一致时,判定读取失败,并重新生成日志文件。
14.可选的,所述获取待保存的日志数据,包括:
15.将生成的日志数据写入日志缓存区;
16.当所述日志缓存区的剩余保存空间小于预设阈值时,对所述日志缓存区中的日志数据进行压缩,得到所述待保存的日志数据。
17.可选的,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:
18.生成节点头,其中,所述节点头包括所述待保存的日志数据的数据长度和该日志
数据对应的压缩前的数据长度;
19.将所述待保存的日志数据写入所述节点头的预设位置,得到待保存的节点;
20.将所述待保存的节点,写入所述日志文件中写指针所指向的位置。
21.可选的,所述识别日志文件中预先保存的日志循环队列中的写指针之后,所述方法还包括:
22.当所述日志文件中没有保存日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,则生成并反馈分配空间不足信息,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于所述预先创建的日志文件的末尾,则将所述待保存的日志数据写入所述预先创建的日志文件中写指针所指向的位置。
23.可选的,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:
24.当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于所述预先创建的日志文件的末尾,且所述写指针指向的位置大于所述读指针指定的位置时,则将所述待保存的日志数据写入所述预先创建的日志文件中写指针所指向的位置。
25.可选的,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:
26.当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,且所述写指针指向的位置大于所述读指针指定的位置时,删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;
27.判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;
28.将所述待保存的日志数据写入写指针所指向的位置。
29.可选的,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:
30.当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于等于所述预先创建的日志文件的末尾,且所述写指针指向的位置小于等于所述读指针指定的位置时,删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;
31.判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;
32.将所述待保存的日志数据写入写指针所指向的位置,将所述写指针指向所述待保存的日志数据的末尾。
33.可选的,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:
34.当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,且所述写指针指向的位置小于等于所述读指针指定的位置时,
35.删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;
36.判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;
37.将所述待保存的日志数据写入写指针所指向的位置,将所述写指针指向所述待保存的日志数据的末尾。
38.可选的,所述方法还包括:
39.接收解压所述预先保存的日志循环队列的解压指令;
40.识别所述日志文件中预先保存的日志循环队列中的读指针;
41.解压该读指针所执行的日志数据,并根据解压得到的日志数据的数据长度和所述读指针执行的位置识别下一日志数据的位置并解压,直至解压完成所述预先保存的日志循环队列中的全部日志数据。
42.本技术实施例的第二方面,提供了一种日志压缩的保存装置,包括:
43.日志数据获取模块,用于获取待保存的日志数据;
44.指针识别模块,用于识别日志文件中预先保存的日志循环队列中的写指针;
45.日志数据写入模块,用于将所述待保存的日志数据写入所述日志文件中写指针所指向的位置。
46.可选的,所述装置还包括:
47.日志文件创建模块,用于创建日志文件,并将该日志文件的属性信息写入自身,其中,所述属性信息包括所述日志文件的标识、所述日志文件预先分配的空间大小。
48.可选的,所述装置还包括:
49.信息读取模块,用于读取所述日志文件的属性信息;
50.读取判定模块,用于当未读取到所述日志文件的属性信息,或所述日志文件的标识与预设标识不一致,或所述日志文件的空间大小与预设信息不一致时,判定读取失败,并重新生成日志文件。
51.可选的,所述日志数据获取模块,包括:
52.日志数据生成子模块,用于生成日志数据,并将生成的日志数据写入日志缓存区;
53.日志数据压缩子模块,用于当所述日志缓存区的剩余保存空间小于预设阈值时,对所述日志缓存区中的日志数据进行压缩,得到所述待保存的日志数据。
54.可选的,所述日志数据写入模块,包括:
55.节点生成子模块,用于生成节点头,其中,所述节点头包括所述待保存的日志数据的数据长度和压缩前的数据长度;
56.节点获取子模块,用于将所述待保存的日志数据写入所述节点头的预设位置,得到待保存的节点;
57.节点生成子模块,用于将所述待保存的节点,写入所述预先创建的日志文件中写
指针所指向的位置。
58.可选的,所述装置还包括:
59.日志数据写入模块,用于当所述日志文件中没有保存日志数据时,若所述写指针与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,则生成并反馈分配空间不足信息,若所述写指针与所述预先创建的日志文件的数据长度之和小于所述预先创建的日志文件的末尾,则将所述待保存的日志数据写入所述预先创建的日志文件中写指针所指向的位置。
60.可选的,所述日志数据写入模块,具体用于当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于所述预先创建的日志文件的末尾,且所述写指针指向的位置大于所述读指针指定的位置时,则将所述待保存的日志数据写入所述预先创建的日志文件中写指针所指向的位置。
61.可选的,所述日志数据写入模块,包括:
62.第一日志删除子模块,用于当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,且所述写指针指向的位置大于所述读指针指定的位置时,删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;
63.第一判断子模块,用于判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;
64.第一写入子模块,用于将所述待保存的日志数据写入写指针所指向的位置。
65.可选的,所述日志数据写入模块,包括:
66.第二日志删除子模块,用于当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于等于所述预先创建的日志文件的末尾,且所述写指针指向的位置小于等于所述读指针指定的位置时,删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;
67.第二判断子模块,用于判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;
68.第二写入子模块,用于将所述待保存的日志数据写入写指针所指向的位置,将所述写指针指向所述待保存的日志数据的末尾。
69.可选的,所述日志数据写入模块,包括:
70.第三日志删除子模块,用于当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,且所述写指针指向的位置小于等于所述读指针指定的位置时,
71.位置指向子模块,用于删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;
72.第三判断子模块,用于判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删
除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;
73.第三写入子模块,用于将所述待保存的日志数据写入写指针所指向的位置,将所述写指针指向所述待保存的日志数据的末尾。
74.可选的,所述装置还包括:
75.解压指令获取模块,用于接收解压所述预先保存的日志循环队列的解压指令;
76.读指针读取模块,用于识别所述日志文件中预先保存的日志循环队列中的读指针;
77.日志解压模块,用于解压该读指针所执行的日志数据,并根据解压得到的日志数据的数据长度和所述读指针执行的位置识别下一日志数据的位置并解压,直至解压完成所述预先保存的日志循环队列中的全部日志数据。
78.本技术实施例的另一方面,提供了一种电子设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
79.存储器,用于存放计算机程序;
80.处理器,用于执行存储器上所存放的程序时,实现上述任一日志压缩的保存方法。
81.本技术实施例的另一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一日志压缩的保存方法。
82.本技术实施例还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述任一日志压缩的保存方法。
83.本技术实施例有益效果:
84.本技术实施例提供的日志压缩的保存方法、装置、电子设备及存储介质,可以获取待保存的日志数据,识别日志文件中预先保存的日志循环队列中的写指针,将所述待保存的日志数据写入所述日志文件中写指针所指向的位置。可见,通过本技术实施例的方法,可以获取待保存的日志数据,并识别预先创建的日志文件中日志循环队列中的写指针,并将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,由于日志文件中的日志数据存储在循环队列中,因此可以通过循环覆盖,实现日志数据的保存。
85.当然,实施本技术的任一产品或方法并不一定需要同时达到以上所述的所有优点。
附图说明
86.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的实施例。
87.图1为本技术实施例提供的日志压缩的保存方法的一种流程示意图;
88.图2为本技术实施例提供的创建的日志文件的示意图;
89.图3为本技术实施例提供的写入日志数据的流程示意图;
90.图4为本技术实施例提供的写入日志数据的第一种示例图;
91.图5为本技术实施例提供的写入日志数据的第二种示例图;
92.图6为本技术实施例提供的写入日志数据的第三种示例图;
93.图7为本技术实施例提供的写入日志数据的第一种流程的实例图;
94.图8为本技术实施例提供的写入日志数据的第四种示例图;
95.图9为本技术实施例提供的写入日志数据的第五种示例图;
96.图10为本技术实施例提供的写入日志数据的第六种示例图;
97.图11为本技术实施例提供的写入日志数据的第二种流程的实例图;
98.图12为本技术实施例提供的写入日志数据的第七种示例图;
99.图13为本技术实施例提供的写入日志数据的第三种流程的实例图;
100.图14为本技术实施例提供的解压日志数据的流程示意图;
101.图15为本技术实施例提供的写入日志数据的第四种流程的实例图;
102.图16为本技术实施例提供的日志压缩的保存装置的一种结构示意图;
103.图17为本技术实施例提供的电子设备的结构示意图。
具体实施方式
104.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员基于本技术所获得的所有其他实施例,都属于本技术保护的范围。
105.本技术实施例的第一方面,提供了一种日志压缩的保存方法,参见图1,包括:
106.步骤s11,获取待保存的日志数据。
107.本技术实施例中的日志可以为多种类型的日志,如应用程序日志,安全日志、系统日志、scheduler服务日志、ftp(filetransferprotocol,文件传输协议)日志、dns(domain name system,域名系统)服务器日志等。其中,获取待保存的日志数据,可以通过自动获取系统生成的日志数据,或接收并根据用户指令读取生成的日志数据。
108.本技术实施例的方法,应用于智能终端,可以通过该智能终端实施,具体的,该智能终端可以是电脑、手机或服务器等。
109.本技术实施例中的待保存的日志数据可以是指压缩后的日志数据。可选的,获取待保存的日志数据,包括:将生成的日志数据写入日志缓存区;当日志缓存区的剩余保存空间小于预设阈值时,对日志缓存区中的日志数据进行压缩,得到待保存的日志数据。例如,将生成的日志数据写入到内存中的日志缓冲区,当日志缓冲区满则压缩日志缓冲区中的数据,并将压缩后的日志数据写入到日志文件中。具体的,写入时需先判断是否存在日志文件,如果不存在或者日志文件无效,则先创建日志文件用于存储压缩后的日志数据。
110.其中,生成的日志数据可以是指程序自动生成的日志数据,如应用程序日志,安全日志、系统日志、scheduler服务日志、ftp日志、dns服务器日志等。本技术实施例中的日志缓存区可以是预先设定的用于进行生成的日志缓存的区域,具体的也可以是日志缓冲区,在实际使用过程中,可以将生成的日主数据缓存至该日志缓存区,并当满足预设触发条件时,则将日志缓存区中的数据压缩并保存至日志文件中。
111.步骤s12,识别日志文件中预先保存的日志循环队列中的写指针。
112.本技术实施例中的日志文件可以是指预先创建的,具体的日志文件中可以保存该
在日志文件对应的空间大小等多种信息。可选的,识别日志文件中预先保存的日志循环队列中的写指针之前,上述方法还包括:创建日志文件,并将该日志文件的属性信息写入自身,其中,属性信息包括日志文件的标识、日志文件预先分配的空间大小。例如,例如,创建日志文件时,先写入一个头部数据,参见图2,里面记录了日志文件标识(具体的,该标识可以是随机数,通过该标识可以保证日志文件的唯一性,确保每次写入的都是同一个文件,从而保证日志数据的连续性),日志文件占用空间大小(预分配),日志数据未压缩前的总大小,日志压缩段的队头(读)指针和队尾(写)指针(日志缓冲区压缩后得到一个日志压缩段,将日志压缩段组成的整体作为一个队列,每次日志数据压缩后形成队列中的一个节点,日志文件刚创建时,没有日志数据,此时队头(读)指针等于队尾(写)指针且都指向日志文件中文件头末尾的位置),文件尾节点指针(指向日志文件中最后一个节点的位置,便于日志循环覆盖以及日志读取)。
113.可选的,识别日志文件中预先保存的日志循环队列中的写指针之前,上述方法还包括:读取日志文件的属性信息;当未读取到日志文件的属性信息,或日志文件的标识与预设标识不一致,或日志文件的空间大小与预设信息不一致时,判定读取失败,并重新生成日志文件。具体的,本技术实施例中的日志文件无效是指:1)该日志文件头部数据读取失败,或2)日志文件头部记录的日志文件标识与代码中预设的标识对应不上,或3)日志文件头部记录的日志文件占用空间大小与代码中预设的对应不上。
114.循环队列,可以是指将日志文件中的预先保存的日志数据组成循环队列,循环队列中可以通过设定的读指针和写指针分别指示读取时对头开始读取的位置和写入时对尾写入的位置,具体的,该读指针队头(读)指针,写指针可以是指队尾(写)。先标记当前待保存的节点为文件中最后一个节点,从而形成循环队列(即将顺序式的文件组织成循环队列),
115.步骤s13,将待保存的日志数据写入日志文件中写指针所指向的位置。
116.将待保存的日志数据写入日志文件中写指针所指向的位置,可以是指存在日志文件且该日志数据有效时,则将待保存的日志数据写入到日志文件中。具体的,当本技术实施例中的待保存的日志数据为压缩日志数据时,可以在日主文件中新增一个节点头(记录压缩前长度和压缩后长度),然后将压缩后的据放到节点头后面形成一个节点,即节点由节点头和压缩后的日志数据组成,从而实现将待保存的日志数据写入日志文件中写指针所指向的位置。
117.可见,通过本技术实施例的方法,可以获取待保存的日志数据,并识别预先创建的日志文件中日志循环队列中的写指针,并将待保存的日志数据写入日志文件中写指针所指向的位置,由于日志文件中的日志数据存储在循环队列中,因此可以通过循环覆盖,实现日志数据的保存。
118.可选的,参见图3,将待保存的日志数据写入预先创建的日志文件中写指针所指向的位置,包括:
119.步骤s31,生成节点头;
120.步骤s32,将待保存的日志数据写入节点头的预设位置,得到待保存的节点;
121.步骤s33,将待保存的节点,写入预先创建的日志文件中写指针所指向的位置。
122.其中,节点头包括待保存的日志数据的数据长度和压缩前的数据长度。上述节点
头的预设位置,可以是节点的头后与该节点头相邻的位置。例如,压缩日志数据后,可以新增一个节点头(记录压缩前长度和压缩后长度),然后将压缩后的数据放到节点头后面形成一个节点,即节点由节点头和压缩后的日志数据组成,并把形成的节点写入到日志文件中。
123.可见,通过本技术实施例的方法,可以生成节点头,将待保存的日志数据写入节点头的预设位置,并将待保存的节点,写入预先创建的日志文件中写指针所指向的位置,从而实现日志数据的保存。
124.具体的,将待保存的日志数据写入日志文件中写指针所指向的位置的方法可以参见后续实施例。
125.可选的,识别日志文件中预先保存的日志循环队列中的写指针之后,上述方法还包括:当日志文件中没有保存日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和大于预先创建的日志文件的末尾,则生成并反馈分配空间不足信息,若写指针指向的位置与预先创建的日志文件的数据长度之和小于预先创建的日志文件的末尾,则将待保存的日志数据写入预先创建的日志文件中写指针所指向的位置。
126.本技术实施例的第一个例子中,写入时,如果日志文件中没有日志数据即一个节点也没有。如图4所示此时,队头(读)指针等于队尾(写)指针,且都指向日志文件中文件头末尾的位置(读写指针的位置在日志文件创建时都赋值为日志文件中文件头末尾的位置),若队尾(写)指针和日志数据压缩后的长度超过日志文件末尾,则直接返回日志文件空间分配不足错误,否则就可以将形成的节点写入到队尾(写)指针都指向的位置,写完后更新队尾(写)指针指向写入的节点的末尾。本技术实施例的图4-图12中,w表示队尾(写)指针,r表示队头(读)指针,len表示形成的节点的长度,eof表示日志文件末尾,end表示当前节点为日志文件中的最后一个节点。
127.可选的,步骤s13将待保存的日志数据写入日志文件中写指针所指向的位置,包括:当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和小于预先创建的日志文件的末尾,且写指针指向的位置大于读指针指定的位置时,则将待保存的日志数据写入预先创建的日志文件中写指针所指向的位置。
128.本技术实施例的第二个例子中,如图5所示,写入时,如果日志文件中有日志数据即有一个或多个节点,同时,队尾(写)指针和日志数据压缩后的长度不超过日志文件末尾,队尾(写)指针大于队头(读)指针。由于队尾(写)指针和日志数据压缩后的长度不超过日志文件末尾,可以直接将形成的节点写入到队尾(写)指针指向的位置,写完后更新队尾(写)指针指向写入的节点的末尾。
129.可选的,步骤s13将待保存的日志数据写入日志文件中写指针所指向的位置,包括:当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和大于预先创建的日志文件的末尾,且写指针指向的位置大于读指针指定的位置时,删除读指针对应的日志数据,并将读指针指向删除的日志文件的下一日志文件对应的位置;判断删除后的读指针和写指针之间的空间是否大于待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于待保存的日志数据的大小,将待保存的日志数据写入写指针所指向的位置。
130.本技术实施例的第三个例子中,写入时,如果日志文件中有日志数据即有一个或
多个节点,同时,队尾(写)指针和日志数据压缩后的长度超过日志文件末尾,并且,队尾(写)指针大于队头(读)指针时。具体过程如图6、图7所示,由于队尾(写)指针和日志数据压缩后的长度超过日志文件末尾,此时,队尾(写)指针距离日志文件末尾的部分空间已经不足以放下待加入的日志数据对应的节点,就需要将待加入的节点放到日志文件头部后面,即日志文件中第一个节点的位置,具体的操作是:先标记当前待保存的节点为文件中最后一个节点,从而形成循环队列(即将顺序式的文件组织成循环队列),再将日志文件头部末尾的位置赋值给队尾(写)指针,然后读取队头(读)指针指向的节点的节点头,并根据读取到的节点头信息,可以计算出该节点的长度(该节点的长度等于节点头记录的日志压缩后的长度和节点自身的长度之和),然后根据计算出的该节点的长度可以得到其下一个节点在日志文件中的位置(下一节点位置等于队头(读)指针和本节点的长度之和),从而得到待保存节点的下一个节点在日志文件中的位置,将队头(读)指针指向的节点删除,再将下一个节点的位置赋值给队头(读)指针,接着判断空出的空间是否小于待加入的节点的大小,如果是,则读取下一个节点的数据并将队头(读)指针偏移到下一个节点的下一个节点的位置,直到空出的空间足够放下待加入的节点,然后将待加入的节点写入到队尾(写)指针指向的位置,写完后更新队尾(写)指针指向写入的节点的末尾。
131.可选的,步骤s13将待保存的日志数据写入日志文件中写指针所指向的位置,包括:当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和小于等于预先创建的日志文件的末尾,且写指针指向的位置小于等于读指针指定的位置时,删除读指针对应的日志数据,并将读指针指向删除的日志文件的下一日志文件对应的位置;判断删除后的读指针和写指针之间的空间是否大于待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于待保存的日志数据的大小;将待保存的日志数据写入写指针所指向的位置,将写指针指向待保存的日志数据的末尾。
132.本技术实施例的第四个例子中,写入时,日志文件中有日志数据,即有一个或多个节点,并且队尾(写)指针和日志压缩后的长度不超过日志文件末尾,队尾(写)指针小于或等于队头(读)指针(发生过循环覆盖)。如图8所示若队尾(写)指针和日志数据压缩后的长度之和小于或等于队头(读)指针,则直接将形成的节点写入到队尾(写)指针指向的位置,写完后更新队尾(写)指针指向写入的节点的末尾。若队尾(写)指针和日志压缩后的长度之和大于队头(读)指针,则删除队头(读)指针指向的节点,并更新队头(读)指针指向下一个节点,空出足够的空间之后,将形成的节点写入到队尾(写)指针指向的位置,写完后更新队尾(写)指针指向写入的节点的末尾,其中,若删除的队头(读)指针指向文件中最后一个节点,则需要更新队头(读)指针指向日志文件头部后面即日志文件中第一个节点,最后出现队尾(写)指针大于队头(读)指针的情况。
133.具体的操作如图9、图10、图11所示,包括:读取队头(读)指针指向的节点的节点头,然后根据读取到的节点头信息,可以计算出该节点的长度,并根据计算出的该节点的长度得到下一节点在日志文件中的位置,判断该下一节点是否为日志文件中的最后一个节点,若是,则将队头(读)指针指向日志文件头部后面,即将队头(读)指针指向日志文件中第一个节点,若否,则将队头(读)指针指向的节点删除,再将下一个节点的位置赋值给队头(读)指针,接着判断空出的空间是否小于待加入的节点的大小,如果是,则读取下一个节点
的数据让队头(读)指针偏移到下一个节点的下一个节点的位置(其中,若删除的队头(读)指针指向文件中最后一个节点,则需要更新队头(读)指针指向日志文件头部后面即日志文件中第一个节点),直到空出的空间足够放下待加入的节点,然后将待加入的节点写入到队尾(写)指针指向的位置,写完后更新队尾(写)指针指向写入的节点的末尾(最后出现队尾(写)指针大于队头(读)指针的情况,然后会出现本技术实施例中的第二个例子或第三个例子对应的情况,从而可以根据第二个例子和第三个例子对应的情况继续执行)。
134.可选的,步骤s13将待保存的日志数据写入日志文件中写指针所指向的位置,包括:当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和大于预先创建的日志文件的末尾,且写指针指向的位置小于等于读指针指定的位置时,删除读指针对应的日志数据,并将读指针指向删除的日志文件的下一日志文件对应的位置;判断删除后的读指针和写指针之间的空间是否大于待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于待保存的日志数据的大小;将待保存的日志数据写入写指针所指向的位置,将写指针指向待保存的日志数据的末尾。
135.本技术实施例的第五个例子中如图12、图13所示,写入时,日志文件中有日志数据,即有一个或多个节点,当队尾(写)指针和日志数据压缩后的长度超过日志文件末尾,并且队尾(写)指针小于或等于队头(读)指针(发生过循环覆盖)时。由于队尾(写)指针和日志数据压缩后的长度超过日志文件末尾,此时队尾(写)指针距离日志文件末尾的部分空间已经不足以放下待加入的节点,则将待加入的节点放到日志文件头部后面即日志文件中第一个节点的位置(队尾(写)指针指向日志头部末尾),删除队头(读)指针指向的节点,并更新队头(读)指针指向下一个节点,直到空出的空间足够放下待加入的节点,最后出现队尾(写)指针小于或等于队头(读)指针的情况。具体的操作如下:先标记当前节点为文件中最后一个节点从而形成循环队列,再将日志文件头部末尾的位置赋值给队尾(写)指针,然后读取队头(读)指针指向的节点的节点头,从而得到待保存节点的下一个节点在日志文件中的位置,将队头(读)指针指向的节点删除,再将下一个节点的位置赋值给队头(读)指针,然后判断空出的空间是否小于待加入的节点的大小,如果是,则读取下一个节点的数据让队头(读)指针偏移到下一个节点的下一个节点的位置(其中,若删除的队头(读)指针指向文件中最后一个节点,则需要更新队头(读)指针指向日志文件头部后面即日志文件中第一个节点),直到空出的空间足够放下待加入的节点,然后就可以将待加入的节点写入到队尾(写)指针指向的位置,写完后更新队尾(写)指针指向写入的节点的末尾(最后出现队尾(写)指针小于或等于队头(读)指针的情况,然后会出现本技术实施例的第四个例子或第五个例子对应的情况,因此可以参照本技术实施例的第四个例子和第五个例子对应的情况继续执行)。
136.可选的,本技术实施例中,在通过上述方法进行日志数据的保存之后,还可以对保存的日志数据进行解压,从而实现日志数据的读取,参见图14,具体的步骤包括:
137.步骤s41,接收解压预先保存的日志循环队列的解压指令;
138.步骤s42,识别日志文件中预先保存的日志循环队列中的读指针;
139.步骤s43,解压该读指针所执行的日志数据,并根据解压得到的日志数据的数据长度和读指针执行的位置识别下一日志数据的位置并解压,直至解压完成预先保存的日志循
环队列中的全部日志数据。
140.在实际使用过程中,本技术实施例的方法还可以包括从日志文件中解压出日志数据。具体的,参见图15,由于日志文件已经组织成循环队列,所以每次读取日志的时候,只需从队头(读)指针开始读,每读取一个节点则解压该节点中的数据,解压后将队头(读)指针加上节点头中的长度信息以及节点头的大小,就可以得到下一个节点的位置,然后接着往下读取以及解压,一直读到队尾(写)指针指向的位置即队尾,代表读取结束也就是解压完毕。
141.本技术实施例的第二方面,提供了一种日志压缩的保存装置,参见图16,包括:
142.日志数据获取模块1601,用于获取待保存的日志数据;
143.指针识别模块1602,用于识别日志文件中预先保存的日志循环队列中的写指针;
144.日志数据写入模块1603,用于将待保存的日志数据写入日志文件中写指针所指向的位置。
145.可选的,上述装置还包括:
146.日志文件创建模块,用于创建日志文件,并将该日志文件的属性信息写入自身,其中,属性信息包括日志文件的标识、日志文件预先分配的空间大小。
147.可选的,上述装置还包括:
148.信息读取模块,用于读取日志文件的属性信息;
149.读取判定模块,用于当未读取到日志文件的属性信息,或日志文件的标识与预设标识不一致,或日志文件的空间大小与预设信息不一致时,判定读取失败,并重新生成日志文件。
150.可选的,日志数据获取模块,包括:
151.日志数据生成子模块,用于生成日志数据,并将生成的日志数据写入日志缓存区;
152.日志数据压缩子模块,用于当日志缓存区的剩余保存空间小于预设阈值时,对日志缓存区中的日志数据进行压缩,得到待保存的日志数据。
153.可选的,日志数据写入模块,包括:
154.节点生成子模块,用于生成节点头,其中,节点头包括待保存的日志数据的数据长度和压缩前的数据长度;
155.节点获取子模块,用于将待保存的日志数据写入节点头的预设位置,得到待保存的节点;
156.节点生成子模块,用于将待保存的节点,写入预先创建的日志文件中写指针所指向的位置。
157.可选的,上述装置还包括:
158.日志数据写入模块,用于当日志文件中没有保存日志数据时,若写指针与预先创建的日志文件的数据长度之和大于预先创建的日志文件的末尾,则生成并反馈分配空间不足信息,若写指针与预先创建的日志文件的数据长度之和小于预先创建的日志文件的末尾,则将待保存的日志数据写入预先创建的日志文件中写指针所指向的位置。
159.可选的,日志数据写入模块,具体用于当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和小于预先创建的日志文件的末尾,且写指针指向的位置大于读指针指定的位置时,则将待保存的日志数据写入预先创
建的日志文件中写指针所指向的位置。
160.可选的,日志数据写入模块,包括:
161.第一日志删除子模块,用于当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和大于预先创建的日志文件的末尾,且写指针指向的位置大于读指针指定的位置时,删除读指针对应的日志数据,并将读指针指向删除的日志文件的下一日志文件对应的位置;
162.第一判断子模块,用于判断删除后的读指针和写指针之间的空间是否大于待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于待保存的日志数据的大小;
163.第一写入子模块,用于将待保存的日志数据写入写指针所指向的位置。
164.可选的,日志数据写入模块,包括:
165.第二日志删除子模块,用于当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和小于等于预先创建的日志文件的末尾,且写指针指向的位置小于等于读指针指定的位置时,删除读指针对应的日志数据,并将读指针指向删除的日志文件的下一日志文件对应的位置;
166.第二判断子模块,用于判断删除后的读指针和写指针之间的空间是否大于待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于待保存的日志数据的大小;
167.第二写入子模块,用于将待保存的日志数据写入写指针所指向的位置,将写指针指向待保存的日志数据的末尾。
168.可选的,日志数据写入模块,包括:
169.第三日志删除子模块,用于当预先创建的日志文件中存在日志数据时,若写指针指向的位置与预先创建的日志文件的数据长度之和大于预先创建的日志文件的末尾,且写指针指向的位置小于等于读指针指定的位置时,
170.位置指向子模块,用于删除读指针对应的日志数据,并将读指针指向删除的日志文件的下一日志文件对应的位置;
171.第三判断子模块,用于判断删除后的读指针和写指针之间的空间是否大于待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于待保存的日志数据的大小;
172.第三写入子模块,用于将待保存的日志数据写入写指针所指向的位置,将写指针指向待保存的日志数据的末尾。
173.可选的,上述装置还包括:
174.解压指令获取模块,用于接收解压预先保存的日志循环队列的解压指令;
175.读指针读取模块,用于识别日志文件中预先保存的日志循环队列中的读指针;
176.日志解压模块,用于解压该读指针所执行的日志数据,并根据解压得到的日志数据的数据长度和读指针执行的位置识别下一日志数据的位置并解压,直至解压完成预先保存的日志循环队列中的全部日志数据。
177.可见,通过本技术实施例的装置,可以获取待保存的日志数据,并识别预先创建的日志文件中日志循环队列中的写指针,并将所述待保存的日志数据写入所述日志文件中写
指针所指向的位置,由于日志文件中的日志数据存储在循环队列中,因此可以通过循环覆盖,实现日志数据的保存。
178.本技术实施例还提供了一种电子设备,如图17所示,包括处理器1701、通信接口1702、存储器1703和通信总线1704,其中,处理器1701,通信接口1702,存储器1703通过通信总线1704完成相互间的通信,
179.存储器1703,用于存放计算机程序;
180.处理器1701,用于执行存储器1703上所存放的程序时,实现如下步骤:
181.获取待保存的日志数据;
182.识别日志文件中预先保存的日志循环队列中的写指针;
183.当写指针指向的位置和待保存的日志数据的数据长度之和小于等于日志文件的末尾时,将待保存的日志数据写入日志文件中写指针所指向的位置。
184.上述电子设备提到的通信总线可以是外设部件互连标准(peripheral component interconnect,pci)总线或扩展工业标准结构(extended industry standard architecture,eisa)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
185.通信接口用于上述电子设备与其他设备之间的通信。
186.存储器可以包括随机存取存储器(random access memory,ram),也可以包括非易失性存储器(non-volatile memory,nvm),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
187.上述的处理器可以是通用处理器,包括中央处理器(central processing unit,cpu)、网络处理器(network processor,np)等;还可以是数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
188.在本技术提供的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一日志压缩的保存方法的步骤。
189.在本技术提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一日志压缩的保存方法。
190.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以
是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solid state disk(ssd))等。
191.需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
192.本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、电子设备、存储介质及计算机程序产品实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
193.以上所述仅为本技术的较佳实施例,并非用于限定本技术的保护范围。凡在本技术的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本技术的保护范围内。
技术特征:1.一种日志压缩的保存方法,其特征在于,包括:获取待保存的日志数据;识别日志文件中预先保存的日志循环队列中的写指针;将所述待保存的日志数据写入所述日志文件中写指针所指向的位置。2.根据权利要求1所述的方法,其特征在于,所述识别日志文件中预先保存的日志循环队列中的写指针之前,所述方法还包括:创建日志文件,并将该日志文件的属性信息写入自身,其中,所述属性信息包括所述日志文件的标识、所述日志文件预先分配的空间大小。3.根据权利要求2所述的方法,其特征在于,所述识别日志文件中预先保存的日志循环队列中的写指针之前,所述方法还包括:读取所述日志文件的属性信息;当未读取到所述日志文件的属性信息,或所述日志文件的标识与预设标识不一致,或所述日志文件的空间大小与预设信息不一致时,判定读取失败,并重新生成日志文件。4.根据权利要求1所述的方法,其特征在于,所述获取待保存的日志数据,包括:将生成的日志数据写入日志缓存区;当所述日志缓存区的剩余保存空间小于预设阈值时,对所述日志缓存区中的日志数据进行压缩,得到所述待保存的日志数据。5.根据权利要求4所述的方法,其特征在于,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:生成节点头,其中,所述节点头包括所述待保存的日志数据的数据长度和该日志数据对应的压缩前的数据长度;将所述待保存的日志数据写入所述节点头的预设位置,得到待保存的节点;将所述待保存的节点,写入所述日志文件中写指针所指向的位置。6.根据权利要求1所述的方法,其特征在于,所述识别日志文件中预先保存的日志循环队列中的写指针之后,所述方法还包括:当所述日志文件中没有保存日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,则生成并反馈分配空间不足信息,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于所述预先创建的日志文件的末尾,则将所述待保存的日志数据写入所述预先创建的日志文件中写指针所指向的位置。7.根据权利要求1所述的方法,其特征在于,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于所述预先创建的日志文件的末尾,且所述写指针指向的位置大于所述读指针指定的位置时,则将所述待保存的日志数据写入所述预先创建的日志文件中写指针所指向的位置。8.根据权利要求1所述的方法,其特征在于,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先
创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,且所述写指针指向的位置大于所述读指针指定的位置时,删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;将所述待保存的日志数据写入写指针所指向的位置。9.根据权利要求1所述的方法,其特征在于,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和小于等于所述预先创建的日志文件的末尾,且所述写指针指向的位置小于等于所述读指针指定的位置时,删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;将所述待保存的日志数据写入写指针所指向的位置,将所述写指针指向所述待保存的日志数据的末尾。10.根据权利要求1所述的方法,其特征在于,所述将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,包括:当所述预先创建的日志文件中存在日志数据时,若所述写指针指向的位置与所述预先创建的日志文件的数据长度之和大于所述预先创建的日志文件的末尾,且所述写指针指向的位置小于等于所述读指针指定的位置时,删除所述读指针对应的日志数据,并将所述读指针指向删除的日志文件的下一日志文件对应的位置;判断删除后的读指针和写指针之间的空间是否大于所述待保存的日志数据的大小,若是则执行下一步,否则继续当前读指针执行的日志文件直至删除后的读指针和写指针之间的空间大于所述待保存的日志数据的大小;将所述待保存的日志数据写入写指针所指向的位置,将所述写指针指向所述待保存的日志数据的末尾。11.根据权利要求1所述的方法,其特征在于,所述方法还包括:接收解压所述预先保存的日志循环队列的解压指令;识别所述日志文件中预先保存的日志循环队列中的读指针;解压该读指针所执行的日志数据,并根据解压得到的日志数据的数据长度和所述读指针执行的位置识别下一日志数据的位置并解压,直至解压完成所述预先保存的日志循环队列中的全部日志数据。12.一种日志压缩的保存装置,其特征在于,包括:日志数据获取模块,用于获取待保存的日志数据;指针识别模块,用于识别日志文件中预先保存的日志循环队列中的写指针;
日志数据写入模块,用于将所述待保存的日志数据写入所述日志文件中写指针所指向的位置。13.一种电子设备,其特征在于,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;存储器,用于存放计算机程序;处理器,用于执行存储器上所存放的程序时,实现权利要求1-11任一所述的方法步骤。14.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现权利要求1-11任一所述的方法步骤。
技术总结本申请实施例提供的一种日志压缩的保存方法、装置、电子设备及存储介质,应用于信息技术领域,可以获取待保存的日志数据,识别日志文件中预先保存的日志循环队列中的写指针,将所述待保存的日志数据写入所述日志文件中写指针所指向的位置。可见,通过本申请实施例的方法,可以获取待保存的日志数据,并识别预先创建的日志文件中日志循环队列中的写指针,并将所述待保存的日志数据写入所述日志文件中写指针所指向的位置,由于日志文件中的日志数据存储在循环队列中,因此可以通过循环覆盖,实现日志数据的保存。实现日志数据的保存。实现日志数据的保存。
技术研发人员:余巍峰
受保护的技术使用者:杭州萤石软件有限公司
技术研发日:2022.07.19
技术公布日:2022/11/1