具体实施方式
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
图1为本说明书的方案在一种实际应用场景下涉及的日志采集***的示意图。根据预设的日志目录对指定的日志文件和日志目录进行监控,日志采集服务器若接收到文件移除事件,则记录下cookie和原文件名;进一步地,若接收到文件移入事件,判断在文件移除事件列表中的cookie是否与文件移入事件列表中的cookie记录相同,若相同,则记录下cookie、原文件名和新文件名;最后,若接收到文件修改事件,则记录原文件名和文件偏移量;若上述三个事件是针对同一个的原文件名,则认为该日志文件发生日志轮转;根据记录的文件偏移量和日志轮转后的新文件名,从原日志文件中采集日志数据。对日志数据进行采集,可以通过日志采集服务器实现。另外,图1中均以服务器的形式示出,表征日志采集可以运行在服务器上,当然,该服务器并非仅是单一一台,还可能采用集群或分布式架构。
本说明书实施例的日志采集***不同于以往的轮询日志采集***。具体来说,第一,本实施例日志采集***具有更高的采集效率,因为以往的日志采集***,采用轮询采集的方式对所有日志文件都进行采集,有一些没有写入新数据的文件也进行采集,降低了采集效率;第二,本实施例日志采集***能够有效防止日志数据丢失,因为以往的日志采集***,按照指定周期进行轮询采集,发生日志轮转后的原日志文件的文件名被修改,导致无法针对具有新文件名的原日志文件进行日志采集,出现日志数据丢失的问题,而本实施例***则针对发生日志轮转后的日志文件进行采集;第三,本实施例采用基于事件类型进行对应的日志采集,不需要考虑日志轮转规则和日志重命名规则,可以有效降低日志采集的难度,简化日志采集规则。
需要说明的是,本说明书实施例中所说的日志采集是基于Linux***实现的,利用***提供的inotify机制来监视日志文件变动事件,添加inotify监视的日志目录或者日志文件在发生创建、删除、移动、修改时,都会发送事件通知。本方案主要使用到其中的三个事件:IN_MODIFY(文件修改事件),IN_MOVED_FROM(文件移除事件)和IN_MOVED_TO(文件移入事件)。若基于同一目录同时发生针对同一个原文件名的上述三个事件,则可认为该日志文件发生日志轮转。具体应用到的事件的类型,可以根据实际需求进行选择,在本说明书实施例中仅作为举例说明,并不构成对本申请技术方案的限制。
基于上述场景,下面对本说明书的方案进行详细说明。
图2为本说明书实施例提供的一种日志采集方法的流程示意图,该方法具体可以包括以下步骤:
步骤S202:获取日志文件的文件变动事件。
日志文件是记录在操作***或其他软件运行中发生的事件或在通信软件的不同用户之间的消息的文件。本申请实施例以操作***发生事件为例进行说明,这里所说的日志文件变动事件可以包括:***的日志文件的文件创建、移除、移入、修改等事件,都会由***发送事件通知。通过文件变动事件,可以了解到文件变动前后的相关日志文件信息,以便针对指定的日志文件进行日志数据的采集。
步骤S204:根据所述文件变动事件的类型,记录所述日志文件对应的文件信息,其中,所述文件信息包括:所述日志文件变动前后的文件信息和变动标记信息。
在接收到文件变动事件后,首先需要判断文件变动事件的类型,针对具体类型进行对应的事件的处理,并记录与该日志文件对应的文件信息。例如,文件变动事件为文件修改事件(IN_MODIFY),确定该事件对应的日志文件为需要进行采集的日志文件后,记录下该日志文件的新文件名和对应的文件偏移量。
需要说明的是,这里所说的新文件名对应的日志文件中存储的是原来日志的数据。具体来说,在日志轮转过程中,会对原日志文件进行重命名,然后生成一个空的,被命名为原文件名的新日志文件用于记录之后的日志数据。例如,***数据库的原日志文件的原文件名为dal-digest.log,在进行日志轮转时,需要对原日志文件进行重命名为dal-digest.log.1,然后生成一个空的、命名为dal-digest.log的新日志文件,用于记录轮转之后新产生的日志数据。
步骤S206:基于所述文件信息,采集所述日志文件的数据。
这里所说的文件偏移量是用来对日志文件进行标记,以便下一次采集时可以准确定位到从当前日志文件中的哪个位置开始继续进行日志数据采集。
例如,***数据库的原日志文件的原文件名为dal-digest.log,假设,在日志轮转之前,上次采集到原日志文件中第90行的位置,并对其进行文件偏移量的标记222;在进行日志轮转后,对原日志文件进行重命名为dal-digest.log.1,同时得到文件名为dal-digest.log的空白的新日志文件;当监听到日志轮转事件后,触发对dal-digest.log.1日志数据的采集,基于上一次文件偏移量222开始进行日志数据的采集。这样,既不会丢失日志数据,也不会对采集过的数据再次采集,可以有效地提高日志采集的工作效率。
根据上述实施例可以了解到,通过对指定的日志目录进行监控的方式,若监控到在同一目录中针对同一日志文件发生了文件移除事件、文件移入事件和文件修改事件,则可认为该日志文件发生日志轮转;进一步地,根据新文件名确定原日志文件,再根据原日志文件中的文件偏移量进行日志数据的采集,可以实现针对发生轮转的日志文件进行采集,避免了轮询采集时重复采集的问题,能够提高日志采集的效率;也可以在发生日志轮转后,及时进行日志数据的采集,可以有效防止日志数据的丢失;采用基于事件进行采集的方式,不需要考虑轮转规则和日志重命名规则,可以简化日志采集的规则,降低日志采集的难度。
在本说明书一个或者多个实施例中,在获取日志文件的文件变动事件之前,还可以包括:根据预设的监控周期和预设的日志目录,对指定的所述日志目录进行监控。
为了提高日志采集效率,往往需要设置监控的日志目录。该日志目录可以根据用户的实际需求进行增删,例如,需要对某个***数据库中所有日志文件进行监控,假设,***数据库产生了新的日志文件,则需要将该新的日志文件添加到日志目录中,以便实现对该***数据库中所有日志文件的监控和数据的采集。
需要说明的是,所述文件变动事件可以包括:文件移除事件(IN_MOVED_FROM)、文件移入事件(IN_MOVED_TO)和文件修改事件(IN_MODIFY)中的至少一个类型。
文件移除事件(IN_MOVED_FROM)用于监控日志文件移除受监控目录;文件移入事件(IN_MOVED_TO)用于监控日志文件移入到受监控目录;文件修改事件(IN_MODIFY)用于监控文件被修改事件,例如,文件中被写入新的日志数据或者文件名称发生修改等。在应用中,根据事件掩码来定义监控事件的类型,通过文件描述符和路径来定义受监控目标日志文件。
在本说明书一个或者多个实施例中,所述日志文件变动前的所述文件信息包括:原文件名,所述日志文件的变动标记信息包括:cookie;若所述文件变动事件的类型为文件移除事件,则记录对应的所述日志文件的cookie和原文件名。
这里所说的文件移除事件的事件列表中包含有cookie和原文件名等信息。由前文所述可知,该原文件名对应的文件中是轮转后生成的空白的日志文件,用于记录新产生的日志数据。其中,这里的cookie用来对两个事件进行关联监控。
在本说明书一个或者多个实施例中,所述日志文件变动后的所述文件信息包括:新文件名;若所述文件变动事件的类型为文件移入事件,判断该文件移入事件的cookie与所述文件移除事件的cookie是否相同;若是,则记录cookie、原文件名和新文件名。
由前文所述可知,cookie用来记录相关联的两个事件,在这里可以用来同时对文件移除事件和文件移入事件进行监控,以便确定是否基于同一个目录针对同一个日志文件进行的两个事件,若是(即,文件移除事件和文件移入事件具有相同的cookie记录),则记录下所监控日志文件的cookie、原文件名和新文件名。
在本说明书一个或者多个实施例中,所述日志文件的变动标记信息还包括:文件偏移量;若所述文件变动事件的类型为文件修改事件,判断所述日志文件的文件指纹是否变化;若是,则记录原文件名和文件偏移量;其中,所述文件偏移量用于对上一次采集后的日志文件进行标记。
需要说明的是,每一个日志文件都有其唯一的文件指纹,如果日志文件发生修改或者移动,都会导致文件指纹发生变化。在实际应用中,文件指纹可以包括dev(设备号)和inode(索引节点),基于inode可以确定该日志文件的创建时间和修改时间等具体信息。因此,可以根据日志文件的文件指纹是否发生变化判断该日志文件是否发生轮转。若发生轮转(即,该文件指纹发生变化),则记录对应的原文件名和文件偏移量。
在本说明书一个或者多个实施例中,所述基于所述文件信息,采集所述日志文件的数据,具体可以包括:若文件移除事件、文件移入事件和文件修改事件针对相同的原文件名,则根据所述文件偏移量,对所述新文件名对应的所述日志文件进行数据采集。
若在同一目录中针对同一原日志文件同时进行了文件移除事件、文件移入事件和文件修改事件,则可以确定该日志文件发生轮转。
例如,若为已采集过的日志文件,先对比文件指纹,当检测到文件指纹变化时认为该日志文件发生轮转,则打标该文件发生文件轮转时的文件偏移量,得到记录(原文件名,文件偏移量)。然后设置当前文件偏移量为0,设置文件指纹为新文件的dev(设备号)+inode(索引节点),其中,inode中存储了这个日志文件的大部分属性,如创建、修改时间等等。但是文件名和节点号不包含在这个inode节点中。这主要是因为inode节点按顺序排列,所以***内核就可以采用简单的算法,就可以得出inode节点号。当检测到同一日志文件相关的IN_MOVED_FROM,IN_MOVED_TO,IN_MODIFY三个事件都被记录时,也就是文件移除事件的(cookie,原文件名),文件移入事件的(cookie,原文件名,新文件名)和文件修改事件的(原文件名,文件偏移量)都被记录时,则对该日志轮转后的日志文件进行采集处理:使用文件偏移量到重命名后的文件里进行相应的日志采集,保证文件轮转导致的为采集的日志数据不丢失,日志采集后,删除本次日志轮转相关的记录。
在本说明书一个或者多个实施例中,所述采集所述日志文件的数据之后,还包括:设置采集后的所述日志文件的文件偏移量和文件指纹。
本实施例的技术方案的日志采集是一个持续循环的过程,如图3所示为本说明书实施例提供的基于文件偏移量的日志采集的方法示意图,步骤S302:获取日志文件的文件变动事件;步骤S304:根据所述文件变动事件的类型,记录所述日志文件对应的文件信息,其中,所述文件信息包括:所述日志文件变动后的新文件名和文件偏移量中的至少一个;步骤S306:基于所述新文件名和所述文件偏移量,采集所述日志文件的数据,完成日志文件采集后,步骤S308:设置采集后的所述日志文件的文件偏移量和文件指纹,例如,需要对已采集完成的日志文件的偏移量置零,对未采集完成的日志文件的文件偏移量进行标记。
基于同样的思路,本说明实施例还提供一种计算机可读介质,所述介质存储有计算机可读指令,所述计算机可读指令可被处理器执行以实现如上任一实施例中所述的方法。
为了便于理解本申请技术方案,下面提供一个具体的实施例,如图4所示为本说明书提供的一种日志监控和采集过程的流程示意图,假设应用***的日志文件为service-digest.log,在跨天出现日志轮转时service-digest.log被重命名为service-digest.log.2017-11-08,然后新建一个空的service-digest.log用于后续的日志记录。日志采集程序会进行如下事件的记录:
S401:定义监控日志目录;
S402:获取文件变动事件;
S403:确定事件类型;进一步地,根据事件类型,执行对应的步骤,具体如下:
S404:IN_MOVED_FROM:记录(cookie:111,文件名:service-digest.log),
S405:IN_MOVED_TO:(cookie:111,文件名:service-digest.log.2017-11-08),通过与IN_MOVED_FROM实际的记录的cookie匹配查找,若找到相同的cookie记录,则可以知道service-digest.log文件被重命名为service-digest.log.2017-11-08,记录(cookie:111,原文件名:service-digest.log,文件名:service-digest.log.2017-11-08)。
S406:IN_MODIFY:(文件名:service-digest.log),通过文件指纹判断是否发生了日志轮转,若是,则记录(文件名:service-digest.log,原文件偏移:222)。
S407:最后结合步骤S405产生的记录(cookie:111,原文件名:service-digest.log,文件名:service-digest.log.2017-11-08)和步骤S406产生的记录(原文件名:service-digest.log,原文件偏移量:222)这两条记录进行日志轮转处理:到service-digest.log.2017-11-08文件里去采集偏移量222之后的日志数据。
基于同样的思路,本说明书实施例还提供一种日志采集装置,如图5所示为本说明书实施例提供的一种日志采集装置的结构示意图,该装置具体可以包括:
获取模块501,获取日志文件的文件变动事件;
记录模块502,根据所述文件变动事件的类型,记录对应的所述日志文件的文件信息,其中,所述文件信息包括:所述日志文件变动前后的文件信息和变动标记信息;
采集模块503,基于所述文件信息,采集所述日志文件的数据。
进一步地,还包括监控模块504,在获取日志文件的文件变动事件之前,所述监控模块504按照预设的监控周期和预设的日志目录,对指定的所述日志目录进行监控。
进一步地,所述文件变动事件包括:文件移除事件、文件移入事件和文件修改事件中的至少一个类型。
进一步地,所述日志文件变动前的所述文件信息包括:原文件名,所述日志文件的变动标记信息包括:cookie;
若所述文件变动事件的类型为文件移除事件,则记录对应的所述日志文件的cookie和原文件名。
进一步地,所述日志文件变动后的所述文件信息包括:新文件名;
若所述文件变动事件的类型为文件移入事件,判断该文件移入事件的cookie与所述文件移除事件的cookie是否相同;
若是,则记录cookie、原文件名和新文件名。
进一步地,所述日志文件的变动标记信息还包括:文件偏移量;
若所述文件变动事件的类型为文件修改事件,判断所述日志文件的文件指纹是否变化;
若是,则记录原文件名和文件偏移量;
其中,所述文件偏移量用于对上一次采集后的日志文件进行标记。
进一步地,所述基于所述文件信息,采集所述日志文件的数据,具体包括:
若文件移除事件、文件移入事件和文件修改事件针对相同的原文件名,则根据所述文件偏移量,对所述新文件名对应的所述日志文件进行数据采集。
进一步地,所述采集所述日志文件的数据之后,还包括:
设置采集后的所述日志文件的文件偏移量和文件指纹。
基于同样的思路,本说明书实施例还提供一种电子设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
获取日志文件的文件变动事件;
根据所述文件变动事件的类型,记录所述日志文件对应的文件信息,其中,所述文件信息包括:所述日志文件变动前后的文件信息和变动标记信息;
基于所述文件信息,采集所述日志文件的数据。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、电子设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书实施例提供的装置、电子设备、非易失性计算机存储介质与方法是对应的,因此,装置、电子设备、非易失性计算机存储介质也具有与对应方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说明,因此,这里不再赘述对应装置、电子设备、非易失性计算机存储介质的有益技术效果。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字***“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的***、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书一个或多个实施例时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本说明书实施例可提供为方法、***、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于***实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本说明书实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。