基于双线程的日志输出方法及装置与流程

文档序号:12063426阅读:197来源:国知局
基于双线程的日志输出方法及装置与流程

本发明涉及通信技术领域,尤其涉及一种基于双线程的日志输出方法及装置。



背景技术:

开发人员了解应用程序(Application,简称:APP)的运行状况,其中一种常规的方法是通过日志,将日志进行重定向,输出至指定的日志文件进行统一收集。

现有技术中,在日志输出的时候,启动一个线程,在该线程中打开日志文件,接着把日志数据写入到日志文件中,最后关闭日志文件,结束线程。因此,每写一条日志,就需要经历一次日志文件的流程“打开文件句柄--写入数据—关闭文件句柄”。

但是,当大量连续的日志输出时,通过上述日志输出方法,容易导致读写文件频繁,给系统输入输出(I/O)带来压力,且处理日志使用的线程数过多,会消耗移动设备宝贵的线程资源,降低CPU分配给业务处理的时间片。



技术实现要素:

本发明提供一种基于双线程的日志输出方法及装置,以解决现有日志输出方法易导致读写文件频繁,系统I/O压力大的问题。

第一方面,本发明提供一种基于双线程的日志输出方法,包括:

接收日志调用请求,将所述日志调用请求中的日志文本数据存储在线程循环队列中;

将所述线程循环队列中存储的日志文本数据写入阻塞队列,所述阻塞队列为内存缓冲区;

监听所述阻塞队列的容量和写入操作,若监听到所述阻塞队列没有写入操作或者达到容量阈值,则触发日志的输入输出线程,将所述阻塞队列中当前所有的日志文本数据一次性写入日志文件。

进一步地,所述将所述阻塞队列中当前所有的日志文本数据一次性写入日志文件,包括:

打开日志文件句柄,从所述阻塞队列中依次获取当前所有的日志文本数据,依次写入每一日志文本数据到所述日志文件中,当前所有的日志文本数据写入所述日志文件结束时,关闭所述日志文件句柄。

进一步地,所述接收日志调用请求之前,还包括:

设置所述线程循环队列的线程优先级低于业务处理的优先级。

进一步地,所述监听到所述阻塞队列没有写入操作,包括:

监听到所述阻塞队列在预设时间内没有写入操作。

第二方面,本发明提供一种基于双线程的日志输出装置,包括:

接收模块,用于接收日志调用请求;

线程循环队列,用于存储所述日志调用请求中的日志文本数据;

阻塞队列,用于存储所述线程循环队列中的日志文本数据,所述阻塞队列为内存缓冲区;

触发模块,用于监听所述阻塞队列的容量和写入操作,若监听到所述阻塞队列没有写入操作或者达到容量阈值,则触发日志的输入输出线程;

日志写入模块,用于将所述阻塞队列中当前所有的日志文本数据一次性写入日志文件。

进一步地,所述日志写入模块具体用于:

打开日志文件句柄,从所述阻塞队列中依次获取当前所有日志文本数据,依次写入每一日志文本数据到所述日志文件中,当前所有日志文本数据写入所述日志文件结束时,关闭所述日志文件句柄。

进一步地,还包括:

设置模块,用于在所述接收模块接收日志调用请求之前,设置所述线程循环队列的线程优先级低于业务处理的优先级。

进一步地,所述触发模块具体用于:

监听到所述阻塞队列在预设时间内没有写入操作。

本发明提供的基于双线程的日志输出方法及装置,通过接收日志调用请求后,使用一个线程将日志调用请求中的日志文本数据写入内存缓冲区,一个线程监听内存缓冲区在没有写入操作或者达到容量阈值时将内存缓冲区中的日志文本数据一次性写入日志文件中,日志缓存和写入分别在两个工作子线程中。从而,内存缓冲区数据写入日志文件的频率低,降低了处理日志使用的线程数,对系统I/O压力小,实现了用较少的CPU和线程资源实现日志的重定向,提高应用内UI交互的响应性能。

附图说明

为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为本发明基于双线程的日志输出方法实施例一的流程图;

图2为本发明基于双线程的日志输出方法实施例二的交互流程图;

图3为本发明基于双线程的日志输出装置实施例一的结构示意图;

图4为本发明基于双线程的日志输出装置实施例二的结构示意图。

具体实施方式

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

图1为本发明基于双线程的日志输出方法实施例一的流程图,本实施例的执行主体可以为终端设备,如手机、IPAD等电子设备,如图1所示,本实施例的方法可以包括:

S101、接收日志调用请求,将日志调用请求中的日志文本数据存储在线程循环队列中。

其中,线程循环队列用于按照队列先入先出存储接收到的日志调用请求中的日志文本数据,在日志输出的时候,要启动一个线程,该日志调用请求就是日志输出前的线程调用请求。

S102、将线程循环队列中存储的日志文本数据写入阻塞队列,阻塞队列为内存缓冲区。

其中,内存缓冲区例如为高速内存缓冲区。

S103、监听阻塞队列的容量和写入操作,若监听到阻塞队列没有写入操作或者达到容量阈值,则触发日志的输入输出线程,将阻塞队列中当前所有的日志文本数据一次性写入日志文件。

具体地,若监听到阻塞队列没有写入操作或者达到容量阈值,将阻塞队列中当前所有的日志文本数据一次性写入日志文件,具体可以为:

打开日志文件句柄,从阻塞队列中依次获取当前所有的日志文本数据,依次写入每一线程对应的日志数据到日志文件中,当前所有的日志文本数据写入日志文件结束时,关闭日志文件句柄。其中的容量阈值例如为阻塞队列容量的80%或者90%等等。

从而,阻塞队列中当前所有的日志文本数据一次性全部写入日志文件,而日志文件句柄的打开和关闭只需各执行一次,因此日志文本数据写入日志文件的频率低,对系统的I/O压力小。

进一步地,监听到阻塞队列没有写入操作,可以为:监听到阻塞队列在预设时间内没有写入操作,预设时间可以是预设的一个时间段,如5S。

本实施例中,可以看出,采用本实施例的日志输出方法,双线程异步写数据,一个线程负责将日志调用请求中的日志文本数据写入内存缓冲区,一个线程负责监听内存缓冲区在满足触发条件时将内存缓冲区中的日志文本数据一次性写入日志文件中,日志缓存和写入分别在两个工作子线程中,缓冲区数据写入日志文件(即磁盘文件)的频率低,降低了处理日志使用的线程数,对系统I/O压力小,用较少的CPU和线程资源实现日志的重定向,提高应用内用户界面(User Interface,简称:UI)交互的响应性能。

进一步地,在S101中接收日志调用请求之前,还可以包括:设置线程循环队列的线程优先级低于业务处理的优先级。从而终端设备在同时接收到日志调用请求和业务处理请求时,可以优先处理业务,不影响业务处理的时间。

本实施例提供的基于双线程的日志输出方法,通过接收日志调用请求后,使用一个线程将日志调用请求中的日志文本数据写入内存缓冲区,一个线程监听内存缓冲区在没有写入操作或者达到容量阈值时将内存缓冲区中的日志文本数据一次性写入日志文件中,日志缓存和写入分别在两个工作子线程中。从而,内存缓冲区数据写入日志文件的频率低,降低了处理日志使用的线程数,对系统I/O压力小,实现了用较少的CPU和线程资源实现日志的重定向,提高应用内UI交互的响应性能。

下面采用一个具体的实施例,对图1所示方法实施例的技术方案进行详细说明。

图2为本发明基于双线程的日志输出方法实施例二的交互流程图,如图2所示,本实施例的方法可以包括:

S201、接收日志调用请求。

S202、启动线程循环队列,将日志调用请求中的日志文本数据存储在线程循环队列中。

S203、日志文本数据写入阻塞队列。

具体地,将线程循环队列中存储的日志文本数据写入阻塞队列,阻塞队列为内存缓冲区。

S204、监听阻塞队列的容量和写入操作。

若监听到阻塞队列没有写入操作或者达到容量阈值,则触发日志的输入输出线程,执行S205。

S205、循环从阻塞队列获取队首的消息。

S206、将获取的日志文本数据写入到一文件中。

S207、接收到获取阻塞队列中的线程全部结束后,将该文件中的数据一次性刷入日志文件中。

图3为本发明基于双线程的日志输出装置实施例一的结构示意图,如图3所示,本实施例的装置可以包括:接收模块11、线程循环队列12、阻塞队列13、触发模块14和日志写入模块15。

其中,接收模块11用于接收日志调用请求。线程循环队列12用于存储日志调用请求中的日志文本数据。阻塞队列13用于存储线程循环队列中的日志文本数据,阻塞队列为内存缓冲区。触发模块14用于监听阻塞队列的容量和写入操作,若监听到阻塞队列没有写入操作或者达到容量阈值,则触发日志的输入输出线程。日志写入模块15用于将阻塞队列中当前所有的日志文本数据一次性写入日志文件。

进一步地,日志写入模块15具体用于:打开日志文件句柄,从阻塞队列中依次获取当前所有的日志文本数据,依次写入每一日志文本数据到日志文件中,当前所有日志文本数据写入日志文件结束时,关闭日志文件句柄。

本实施例的装置,可以用于执行图1所示方法实施例的技术方案,其实现原理类似,此处不再赘述。

本实施例提供的基于双线程的日志输出装置,通过接收日志调用请求后,使用一个线程将日志调用请求中的日志文本数据写入内存缓冲区,一个线程监听内存缓冲区在没有写入操作或者达到容量阈值时将内存缓冲区中的日志文本数据一次性写入日志文件中,日志缓存和写入分别在两个工作子线程中。从而,内存缓冲区数据写入日志文件的频率低,降低了处理日志使用的线程数,对系统I/O压力小,实现了用较少的CPU和线程资源实现日志的重定向,提高应用内UI交互的响应性能。

图4为本发明基于双线程的日志输出装置实施例二的结构示意图,如图4所示,本实施例的装置在图3所示装置结构的基础上,进一步地,还可以包括:设置模块16,该设置模块16用于在接收模块11接收日志调用请求之前,设置线程循环队列的线程优先级低于业务处理的优先级。

进一步地,触发模块14具体用于:监听到阻塞队列在预设时间内没有写入操作。

本实施例的装置,可以用于执行图1所示方法实施例的技术方案,其实现原理类似,此处不再赘述。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。

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

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