一种日志记录方法和装置与流程

文档序号:11729396阅读:139来源:国知局
一种日志记录方法和装置与流程

本发明涉及日志管理领域,尤其涉及一种日志记录方法和装置。



背景技术:

在日常开发中,日志的记录是必不可少的。对同一个文件进行写日志只能单线程的去写,通常会使用简单的lock(锁)来保证当前时刻只有一个线程对同一个日志文件进行写操作,从而保证日志输出的正确性。但是这种方式的缺点也很明显,就是系统在高并发的情况下,效率会非常的差。很容易导致系统性能瓶颈,降低系统处理能力。

即便使用多线程的处理方式来避免系统处理能力的下降,但是在多线程写日志记录的时候,由于日志记录需要与磁盘i/o交互,导致单一线程占用锁的时间会加长,从而导致大量线程的阻塞与等待,降低系统的处理能力。



技术实现要素:

本发明旨在解决上面描述的问题。

根据本发明的第一方面,一种日志记录方法,包括:

为日志文件写入任务分配缓存队列组,所述缓存队列组包含至少两个缓存队列;

选择所述缓存队列组中的至少一个缓存队列作为当前缓存队列;

将所述当前缓存队列中的日志数据写入磁盘中的日志文件,同时所述缓存队列组中除所述当前缓存队列外的缓存队列获取待写入的日志数据。

优选的,将所述当前缓存队列中的日志数据写入磁盘中的日志文件,同时所述缓存队列组中除所述当前缓存队列外的缓存队列获取待写入的日志数据包括:

创建i/o线程,进行所述当前缓存队列中的日志数据向日志文件中的写入,在写入期间对所述日志文件添加同步锁,在写入完成后解除该同步锁;

创建逻辑线程,进行所述缓存队列组中除所述当前缓存队列外的缓存队列对待写入的日志数据的获取。

优选的,该方法还包括:

在所述当前缓存队列中的日志数据全部写入完成后,从所述缓存队列组中重新选择当前缓存队列。

优选的,该方法还包括:

所述逻辑线程在所述当前缓存队列中的日志数据全部写入完成后,重新选择当前缓存队列完成之前,对待写入的日志数据的获取添加同步锁。

优选的,该方法还包括:

对于多个日志文件写入任务,为每个日志文件写入任务分别分配对应的缓存队列组。

根据本发明的另一方面,一种日志记录装置,包括:

队列生成模块,用于为日志文件写入任务分配缓存队列组,所述缓存队列组包含至少两个缓存队列;

控制模块,用于选择所述缓存队列组中的至少一个缓存队列作为当前缓存队列;

读写管理模块,用于将所述当前缓存队列中的日志数据写入磁盘中的日志文件,同时所述缓存队列组中除所述当前缓存队列外的缓存队列获取待写入的日志数据。

优选的,所述读写管理模块包括:

第一线程管理单元,用于创建i/o线程,进行所述当前缓存队列中的日志数据向日志文件中的写入,在写入期间对所述日志文件添加同步锁,在写入完成后解除该同步锁;

第二线程管理单元,用于创建逻辑线程,进行所述缓存队列组中除所述当前缓存队列外的缓存队列对待写入的日志数据的获取。

优选的,所述控制模块,还用于在所述当前缓存队列中的日志数据全部写入完成后,从所述缓存队列组中重新选择当前缓存队列。

优选的,所述队列生成模块,还用于对于多个日志文件写入任务,为每个日志文件写入任务分别分配对应的缓存队列组。

本发明提供了一种日志记录方法与装置,为日志文件写入任务分配缓存队列组,所述缓存队列组包含至少两个缓存队列,选择所述缓存队列组中的至少一个缓存队列作为当前缓存队列,将所述当前缓存队列中的日志数据写入磁盘中的日志文件,同时所述缓存队列组中除所述当前缓存队列外的缓存队列获取待写入的日志数据,以双缓存队列或多缓存队列的形式进行分工,缓存数据与写入数据同步进行,实现了高效并行的日志数据缓存写入,解决了系统处理能力低的问题。

参照附图来阅读对于示例性实施例的以下描述,本发明的其他特性特征和优点将变得清晰。

附图说明

并入到说明书中并且构成说明书的一部分的附图示出了本发明的实施例,并且与描述一起用于解释本发明的原理。在这些附图中,类似的附图标记用于表示类似的要素。下面描述中的附图是本发明的一些实施例,而不是全部实施例。对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,可以根据这些附图获得其他的附图。

图1示例性地示出了本发明的实施例一提供的一种日志记录方法流程;

图2示例性地示出了本发明的实施例二提供的一种日志记录装置的结构。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。

无论是单线程还是多线程的日志文件写入方式,均存在系统处理效率低的问题。为了解决该问题,本发明的实施例提供了一种日志记录方法和装置。下面结合附图,对本发明的实施例进行详细说明。

首先结合附图,对本发明的实施例一进行说明。

本发明实施例提供了一种日志记录方法,使用该方法,能够在保证可靠性的前提下有效提高日志文件写入效率。使用该方法完成日志记录的流程如图1所示,包括:

步骤101、为日志文件写入任务分配缓存队列组,所述缓存队列组包含至少两个缓存队列;

本步骤中,首先为日志文件写入任务分配缓存队列组,缓存队列组中配置有多个缓存队列。在一般的应用环境中,多采用一个缓存队列组包含两个缓存队列的配置方式。

对于多个日志文件写入任务,为每个日志文件写入任务分别分配对应的缓存队列组。

以下,以每组包含两个缓存队列为例进行说明。本步骤中,创建多组缓存队列组(缓存队列组为双缓存),为每个用户分配一组缓存队列。

步骤102、选择所述缓存队列组中的至少一个缓存队列作为当前缓存队列;

本步骤中,从缓存队列组内选择一个缓存队列作为当前缓存队列,当前缓存队列即为负责数据写入日志数据到磁盘的缓存队列,除当前缓存队列外的其他缓存队列负责接收待写入磁盘的日志数据。可根据预置的筛选规则,从所述缓存队列组中存储有日志数据的缓存队列中选择至少一个缓存队列作为当前缓存队列。筛选规则可根据应用场景确定,如选择已缓存日志数据较多的缓存队列作为当前缓存队列或将可用缓存队列以列表的形式呈现后,接收用户指令,根据用户指令确定当前缓存队列。

具体的,可以日志缓存列表的形式实现缓存队列。例如,创建缓存队列组,包含日志缓存列表buffera和日志缓存列表bufferb,并且指定当前正在使用的日志缓存列表。

步骤103、将所述当前缓存队列中的日志数据写入磁盘中的日志文件,同时所述缓存队列组中除所述当前缓存队列外的缓存队列获取待写入的日志数据;

本步骤中,缓存队列组中的部分缓存队列进行日志数据向磁盘中日志文件的写入,另一部分缓存队列获取待写入的日志数据,向磁盘写入数据与继续获取待写入的日志数据通过不同线程并行进行,大大提高了日志文件写入效率。

本步骤中,优选的,为两个缓存队列分别配置线程:

创建i/o线程,进行所述当前缓存队列中的日志数据向日志文件中的写入,在写入期间对所述日志文件添加同步锁;

创建逻辑线程,进行所述缓存队列组中除所述当前缓存队列外的缓存队列对待写入的日志数据的获取。

仍以一个缓存队列组中包含两个缓存队列为例进行说明,两个缓存队列中的一个给逻辑线程用来读,另一个负责给i/o线程来写。

日志数据作为一个stringbuffer添加到当前正在使用的arraylist<stringbuffer>a中,另一个则空闲。

将当前的日志文件进行加锁同步,根据条件判断获得当前需要进行输出缓存的日志缓存列表,进行日志文件的缓存写入。

i/o线程每次写缓存队列时需要添加同步锁,但是逻辑线程在读队列是不需要加锁的。

当有多个线程来进行日志记录的时候,将需要写入的日志数据先存放到负责写入的缓存队列当中,然后将逻辑读的线程设为非阻塞方式。此时逻辑读的队列就开始工作了。在当逻辑读的线程读取他自己的缓存队列的数据之后,将逻辑读的缓存队列和负责写入的缓存队列进行交换。

步骤104、在所述当前缓存队列中的日志数据全部写入完成后,从所述缓存队列组中重新选择当前缓存队列;

本步骤中,在当前缓存队列中的日志数据向磁盘写入完成后,就从所述缓存队列组中重新选择当前缓存队列,将其他已缓存有日志数据的缓存队列选择为新的当前缓存队列,将新的当前缓存队列中的日志数据继续向磁盘写入;而上一个当前缓存队列则继续获取待写入的日志数据。通过这样的交替,实现不间断的数据写入。

仍以一个缓存队列组中包含两个缓存队列为例进行说明,当逻辑线程读完队列后会将自己的缓存队列与i/o线程的缓存队列相互调换。逻辑线程在调换队列时也需要添加同步锁,既在所述当前缓存队列中的日志数据全部写入完成后,重新选择当前缓存队列完成之前,对待写入的日志数据的获取添加同步锁。

当内存中的日志数据输出到磁盘文件后,会将当前使用的arraylist<buffer>a与空闲的arraylist<buffer>b进行角色的互换。具体流程如下:

如果获取的当前正在将日志数据写入缓存的是arraylist<buffer>a,则arraylist<buffer>a转换为写入磁盘缓存。从而将正在空闲的arraylist<buffer>b转换为继续接收日志数据写入的缓存列表。交换后空闲的arraylist<buffer>b将接收日志数据,而之前已经写入内容的arraylist<buffer>a则用来输出日志文件到磁盘存储。

日志缓存列表占用的缓存区的大小可根据任务中涉及的数据量大小进行调整,如果缓存区很小,就更能及时处理数据,但是吞吐量以及出现资源竞争的几率就会随之增大;缓存区设置较大则效果相反。

优选的,可以给缓存区设置容量上限,在缓存区存储的数据量超过上限之后,再接收到的数据将会丢弃而不插入日志缓存列表。

将缓存列表a中的日志文件输出到磁盘,支持内存大小触发和刷新时间间隔触发写入磁盘文件。

双缓存列表的交互可以避免每次日志文件输出到磁盘时影响新日志数据的接收以及多线程锁的问题。

日志文件输出到磁盘是支持多种输出方式,可以根据时间间隔触发写操作,也可以根据内存缓冲去大小触发写操作。

下面结合附图,对本发明的实施例二进行说明。

本发明实施例提供了一种日志记录装置,能够与本发明的实施例一提供的一种日志记录方法相结合,进行高效的日志文件写入,该装置的结构如图2所示,包括:

队列生成模块201,用于为日志文件写入任务分配缓存队列组,所述缓存队列组包含至少两个缓存队列;

控制模块202,用于选择所述缓存队列组中的至少一个缓存队列作为当前缓存队列;

读写管理模块203,用于将所述当前缓存队列中的日志数据写入磁盘中的日志文件,同时所述缓存队列组中除所述当前缓存队列外的缓存队列获取待写入的日志数据。

优选的,所述读写管理模块203包括:

第一线程管理单元2031,用于创建i/o线程,进行所述当前缓存队列中的日志数据向日志文件中的写入,在写入期间对所述日志文件添加同步锁;

第二线程管理单元2032,用于创建逻辑线程,进行所述缓存队列组中除所述当前缓存队列外的缓存队列对待写入的日志数据的获取。

优选的,所述控制模块202,还用于在所述当前缓存队列中的日志数据全部写入完成后,从所述缓存队列组中重新选择当前缓存队列。

优选的,所述队列生成模块201,还用于对于多个日志文件写入任务,为每个日志文件写入任务分别分配对应的缓存队列组。

本发明的实施例提供了一种日志记录方法与装置,为日志文件写入任务分配缓存队列组,所述缓存队列组包含至少两个缓存队列,选择所述缓存队列组中的至少一个缓存队列作为当前缓存队列,将所述当前缓存队列中的日志数据写入磁盘中的日志文件,同时所述缓存队列组中除所述当前缓存队列外的缓存队列获取待写入的日志数据,以双缓存队列或多缓存队列的形式进行分工,缓存数据与写入数据同步进行,实现了高效并行的日志数据缓存写入,解决了系统处理能力低的问题。

上面描述的内容可以单独地或者以各种方式组合起来实施,而这些变型方式都在本发明的保护范围之内。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制。尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

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