具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
下面结合说明书附图,对本发明实施例提供的一种日志的处理方法、装置及服务器的具体实施方式进行说明。
首先对本发明实施例提供的一种日志的处理方法进行说明,如图1所示,该方法具体包括以下步骤:
S11、为待处理的日志文件分配多个线程;
S12、根据多个线程的数量,对待处理的日志文件的数据进行分块;
S13、使用多个线程并行地对日志文件的各个块分别进行处理。
下面分别对上述各步骤进行详细说明。
上述S11中,用于处理待处理日志的多个线程的数量,在具体实施时,可以根据处理器的数量和每个处理器的内核数来确定。
在现有技术中,由于串行的日志处理方式,会带来日志处理效率的低下,在本发明实施例中,将日志由串行处理更改为并行处理,这就需要多个线程同时参与日志的处理过程。
处理日志的线程的数量,可以依照当前处理器的内核数来确定,按照目前的计算机技术的发展,采用多处理器已经成为主流,这样,多个处理器存在的情况下,可以根据处理器的内核数量来确定线程的数量,例如,采用下述公式来计算多个线程的数量:
多个线程的数量=处理器的数量*每个处理器的内核数-1。
上述公式中,处理器的内核是指处理器的逻辑核心数。
上述公式的原理在于:所有处理器拥有的线程数即处理器拥有的逻辑核心数的总数即:处理器的数量*每个处理器的内核数,由于在多线程并行处理日志时,除了并行处理的多个线程之外,还必须保留一个主线程,因此,参照上述公式,参与并行处理日志的线程数量可以为:处理器的数量*每个处理器的内核数-1。
当然,本发明实施例中,参与并行处理日志的线程数量也不限于使用上述公式计算,与串行进行日志的处理的方式相比,即使参与并行处理的线程数量较少,比如2、3个,也会带来处理效率的极大的提高,但是,在能够使用的线程数量的范围内,并不是参与并行处理的线程的数量越多并行处理的效率越高,在并行处理的线程数量达到一定的数值时,随着线程的数量的增加其处理效率会无变化甚至会稍有降低,在具体实施时,可以经过试验,选取适当数量的线程参与并行处理日志,达到提高处理效率的技术效果。
进一步地,上述S12中,根据多个线程的数量,对待处理的日志文件的数据进行分块,具体通过下述过程实现:
将日志文件的大小除以多个线程的数量,得到每个线程需处理的字节数;
根据每个线程需处理的字节数,对日志文件进行分块。
由于日志文件中每行日志均以分割符与其他行相区分,如果将日志文件的大小除以多个线程的数量,得到每个线程需处理的字节数,严格按照每个线程需处理的字节数作为块大小进行分块的话,会使得分块的首或者尾出现断行,即不完整的数据,对于每个线程来说,断行的数据是不能正常处理的,因此,在本发明实施例中,需要把这些不完整的数据的大小计算出来,把日志文件中相邻的两块的断行补全。
具体来说,就是在进行分块时,将前面计算出来的线程需处理的字节数作为每个块的大小,对日志文件进行初步分块,然后判断每个分块的最后一行日志是否为断行,若是,将该最后一行日志进行补齐或者划分到下一个块,调整初步分块得到的各个块的大小。
本发明实施例中,日志文件可以是IIS(Internet Information Services)W3C格式的日志,但不局限于IIS W3C格式的日志,日志的载体可以是后缀名为.log的文件,但并不限于上述后缀名的文件,还可以是具有其他后缀名的纯文本文件。
本发明实施例中,线程对日志文件的处理包括对日志进行解析等操作。
为了更好地说明上述分块的过程,下面一个具体的实例进行详细说明。
假设处理器数量是1,内核数是4,日志文件的字节数是102400。
根据上述公式:多个线程的数量=处理器的数量*每个处理器的内核数-1;计算出参与日志并行处理线程数是3,为了描述的方便,下面称为线程1、线程2和线程3,同时把日志等分为3块,这样,平均每个线程处理的字节数是34133,余数是1。
如图2所示,初步分块的结果如下:
线程1处理的字节数是34133,即图2所示的A块文件;
线程2处理的字节数是34133,即图2所示的B块文件;
线程3处理的字节数是34134,即图2所示的C块文件;
对初步划分的各块进行断行补齐过程,即调整各块大小的过程。补齐时,可以将某一块的末尾断行从下一块中补齐,也可以将该块的末尾断行划分到下一块中去补齐下一块的首行。
下面采用将末尾断行划分下一块去补齐的方式进行继续说明。
在这个实例中,使用指针来标识一个块的结尾数据。
首先,从初步划分后得到的A块文件的最后一个字符向前一个一个字符串顺序读取,直到读取的字符串是行分隔符(例如回车换行符),记录读取的总字节数(如果不是断行,则记录的字节数是0)。
用同样的方式处理B块文件,记录B文件最后一行的字节数。
C块文件是最后一个日志块,最后一行是完整的,所以不处理跳过。
然后修正初步分块(等分)之后各块的指针偏移值:
A文件处理的指针起点=0,长度=34133–A块文件最后一行的字节数;
B块文件处理的指针起点=34133–A块文件最后一行的字节数,长度=34133+A块文件最后一行的字节数–B块文件最后一行的字节数
C块文件处理的指针起点=68266–B块文件最后一行的字节数,长度=34134+B块文件最后一行的字节数。
经过上述调整过程后,线程1、线程2和线程3就可以分别从修正后的指针的起点开始处理相应大小的块。
进一步地,在上述S11~S13之后,本发明实施例提供的上述日志的处理方法,还包括下述步骤:
判断所有线程是否都对完成对块的处理;
若是,对所有线程的处理结果执行去重、合并和输入数据库的操作。
如图3所示的是上述实例的实现流程,该流程中,首先初始化该流程涉及到的数据集合以及执行期间需要使用的内部变量,然后,打开待处理的日志文件,读取日志读取出日志文件的大小(字节数),读取处理器的数量以及内核数,并据此分配参与并行处理的线程,并计算每个线程处理的日志的块的大小,同时计算等分日志的偏移值。
随后,所分配的n个线程并行处理各个块,即每个线程按照计算好的指针起点开始读取日志,对日志在内存集合中进行解析,然后判断是否所有线程都处理完毕,当所有线程都处理完毕之后,对内存集合中处理的结果进行去重和合并,例如针对同一个用户的行为数据出现在多个内存集合的情况,按照业务需求对相同的数据进行去重或者保留该用户最新的行为数据。
最后将经过去重和合并处理后的数据插入数据库。
另外,本发明实施例提供的上述日志的处理方法,在实际应用时,较佳地适用于比较大的日志文件,如果日志文件太小,例如不足100兆,则多线程并行处理的方式的处理效率甚至会低于传统的串行的处理效率,在实施本发明实施例提供的上述方法之前,还可以先判断一下待处理的日志文件的大小,如果小于设定的阈值(例如100M),那么可以采用现有技术的处理方法,如果大于该阈值,则采用本发明实施例提供的上述方法。
基于同一发明构思,本发明实施例还提供了一种日志的处理装置及服务器,由于这些装置和服务器所解决问题的原理与前述日志的处理方法相似,因此该装置和服务器的实施可以参见前述方法的实施,重复之处不再赘述。
本发明实施例提供的日志的处理装置,如图4所示,包括:
分配模块401,用于为待处理的日志文件分配多个线程;
分块模块402,用于根据多个线程的数量,对待处理的日志文件的数据进行分块;
并行处理模块403,用于使用多个线程并行地对日志文件的各个块分别进行处理。
进一步地,本发明实施例提供的日志的处理装置,如图4所示,还包括:确定模块404;
上述确定模块404,用于根据处理器的数量和每个处理器的内核数确定所述多个线程的数量。
上述确定模块404,进一步用于通过下述公式计算多个线程的数量:多个线程的数量=处理器的数量*每个处理器的内核数-1。
进一步地,上述分块模块402,具体用于将日志文件的大小除以所述多个线程的数量,得到每个线程需处理的字节数;根据所述每个线程需处理的字节数,对所述日志文件进行分块。
进一步地,上述分块模块402,具体用于将线程需处理的字节数作为每个块的大小,对日志文件进行初步分块;判断每个分块的最后一行日志是否为断行,若是,将该最后一行日志进行补齐或者划分到下一个块,调整初步分块得到的各个块的大小。
进一步地,本发明实施例提供的日志的处理装置,如图4所示,还包括:后处理模块405,用于在使用所述多个线程并行地对日志文件的各个块分别进行处理之后,判断所有线程是否都对完成对块的处理;若是,对所有线程的处理结果执行去重、合并和输入数据库的操作。
本发明实施例还提供了一种服务器,该服务器包括本发明实施例提供的上述日志的处理装置。
本发明实施例提供的日志的处理方法、装置及服务器,首先为待处理的日志文件分配多个线程,然后根据多个线程的数量,对待处理的日志文件的数据进行分块,使用多个线程并行地对日志文件的各个块分别进行处理,与现有技术中采用串行方式处理日志文件的方式相比,可以有效地提高日志的执行速度,提升了日志的整体处理效率,同时节约了处理器的资源。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的日志的处理装置、服务器中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。