专利名称:一种输出日志的方法及系统的制作方法
技术领域:
本申请涉及计算机网络领域,尤其涉及一种输出日志的方法及系统。
背景技术:
用户通过互联网浏览一个页面时,会先从电脑配置的DNS (Domain NameSystem,域名解析系统)找到ip地址,然后根据ip地址和路由,找到实际的服务器地址,再将请求发送到web服务器,web服务器收到请求后,响应请求内容后,再记录日志。请参考图1,其为传统的apache+pipe+cronolog记录日志方式,在apache启动的时候,会按照客户端client的配置个数启动多个apache进程来接受网页访问请求,所述日志记录方式启动后,每个apache子进程按照apache多进程机制轮转运行。同时,所述记录日志方式还会启动一个cronolog子进程,cronolog进程不断读取从管道pipe过来的内容,并将其写到对应的日志文件里。本申请的申请人在实现本申请实施例的过程中,发现上述技术方案存在如下问题:—、在多个apache进程发送数据内容到管道pipe时,由于apache内核是利用P0SIX(可移植操作系统接口)的PIPE_BUF作为缓存区,其配置值为4K,如果传送的数据内容超出4K,客户端通讯底层就需要将数据内容分批发送,而在多进程并发的情况下,多个apache进程就会同时抢一个管道,在单个apache子进程发送超过4k的日志内容时,会使得一条超过4K的日志被分开成两条或多条日志内容,从而造成日志内容输出错乱。二、由于web进程和cronolog进程之间是利用标准的操作系统管道机制进行通讯,而操作系统默认的PIPE_BUF只有4K,在一些有特殊要求的应用场景下,4K的长度值是不足够的。
发明内容
本申请提供了一种输出日志的方法,用于解决在日志内容超过4k的情况下,输出日志错乱的技术问题,同时,解决了现有技术中对日志内容4k的日志长度限制。一方面,通过本申请的一个实施例,提供了如下技术方案:一种输出日志的方法,应用于一 WEB服务器中,所述WEB服务器包括至少一个apache子进程,及一个server子进程,基于domain socket机制,在所述至少一个apache子进程中每个apache子进程与所述server子进程间建立有对应有数据接收端口的socket ;一个监听端口,用于监听所述至少一个apache子进程中是否有apache子进程发出连接请求,所述方法包括:通过所述监听端口接收由所述至少一个apache子进程中一个子进程发送的连接请求;基于所述连接请求,打开所述连接请求对应apache子进程对应的socket对应的数据接收端口;
接收由所述连接请求对应apache子进程发送来的日志数据包;在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,将所述日志数据包写成日志文件。另一方面,通过本申请的另一个实施例,提供了如下技术方案:一种输出日志的系统,应用于一 WEB服务器中,所述WEB服务器包括至少一个apache子进程,及一个server子进程,基于domain socket机制,在所述至少一个apache子进程中每个apache子进程与所述server子进程间建立有对应有数据接收端口的socket ;一个监听端口,用于监听所述至少一个apache子进程中是否有apache子进程发出连接请求,所述系统包括:连接请求接收模块,用于通过所述监听端口接收由所述至少一个apache子进程中一个子进程发送的连接请求;打开模块,用于基于所述连接请求,打开所述连接请求对应apache子进程对应的socket对应的数据接收端口 ;日志数据包接收模块,用于接收由所述连接请求对应apache子进程发送来的日志数据包;日志文件生成模块,用于在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,将所述日志数据包写成日志文件。上述技术方案中的一个或多个技术方案,具有如下技术效果或优点之一:一、通过采用domain socket和server/client机制记录日志,解决了在传统的日志记录方式中,日志内容超过4k时,输出日志错乱的技术问题,达到了准确输出日志的技术效果;二、由于在记录日志时,每个记录日志进程都有对应的socket连接传输数据,解决了现有技术中对日志长度的限制,满足了输出的日志对日志长度在特殊要求应用场景下的扩展性需要;三、通过采用正常的server/client机制结合原有的日志记录模式,使得在server服务异常的时候,能够撤回到原有的封装记录日志模式,使得记录日志方式包含容错和后补机制。
图1为本申请中现有技术中记录日志示意图;图2为本申请实施例中输出日志的方法示意图;图3为本申请实施例中输出日志的方法流程图;图4为本申请实施例中服务端进程的流程图;图5为本申请实施例中输出日志的系统模块图。
具体实施例方式下面结合各个附图对本申请实施例技术方案的主要实现原理具体实施方式
及其对应能够达到的有益效果进行详细地阐述。请参考图2,其为本申请实施例中输出日志的方法示意如图所示,每个apache进程都有一个对应的socket管道,当apache进程产生数据内容时,通过其对应的socket连接,就可以将所述数据传送给所述server进程,server进程接收来自各个apache子进程中的数据内容,在根据数据内容中数据包的长度就可以知道整个数据内容是否传输完毕,在完成数据内容传输后,server进程再根据时间片轮转原则,将各个apache进程中传送过来得数据内容写入到日志文件。同时,在所述server服务端不能使用时或服务时,还可以退回到原有的pipe管道方式记录日志。结合图2,请参考图3,其为本申请实施例中输出日志的方法流图。下面将对图3中,各个步骤作详细具体的描述。步骤300,通过所述监听端口接收由所述至少一个apache子进程中一个子进程发送的连接请求;在具体的实施过程中,本方法应用在apache服务器中,采用cronolog日志分割工具对apache服务器中各个apache子进程记录的日志内容进行记录,apache子进程预先建立socket连接到cronolog server进程,在apache主进程启动的时候,正常启动cronolog进程,并启动封装后的cronolog server进程。在接受所述连接请求时,基于预先配置的socket文件,绑定所述监听端口,利用epoll功能,监听所述监听端口,并接收由所述至少一个apache子进程中一个子进程发送的连接请求。步骤310,基于所述连接请求,打开所述连接请求对应apache子进程对应的socket对应的数据接收端口 ;在具体的实施过程中,基于所述多个子进程发送连接请求的时间顺序,并基于所述多个子进程中每个子进程发送的连接请求,打开所述多个子进程中每个子进程的连接请求对应apache子进程对应的socket对应的数据接收端口。Server进程会利用多线程机制,一个线程处理一个连接请求事件即触发事件;步骤320,接收由所述连接请求对应apache子进程发送来的日志数据包;在具体的实施过程中,接收所述日志数据包会基于epoll_wait给的事件触发顺序,接收由所述连接请求中每个连接请求对应apache子进程发送来的日志数据包。步骤330,在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,将所述日志数据包写成日志文件。在具体的实施过程中,在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,采用所述server子进程的轮转文件功能,将所述日志数据包写成日志文件。另外,在所述server子进程不响应连接请求或接收日志数据包失败时,还通过pipe管道将日志数据包发送给所述cronolog子进程的进程,即退回到原有的子进程记录日志方式。下面请参考图4,其为本申请实施例中输出日志的流程图;步骤400,打开监听连接请求的socket端口 ;在具体的实施过程中,在收到连接请求后,打开一个socket端口,用于把日志内容传送给server服务端。
步骤410,读取配置的sock文件,绑定文件和所述socket端口 ;在具体的实施过程中,读取配置好的sock文件,使socket端口做好进行日志内容传送的准备,并配置好相关数据的初始化工作。同时绑定所述配置文件和所述端口,在后续处理过程中就可以查看对应的配置工作。步骤420,监听socket端口,将连接请求事件放入事件数组;在具体的实施过程中,监听socket端口是否有连接请求事件发生,若发现有连接请求事件,将所述请求事件放在请求事件的数组中。步骤430,判断当前触发的连接请求事件是否在当前的端口上;在具体的实施过程中,在请求事件发送后,判断所述请求事件对应的端口是否为当前的端口,如果是,则进入步骤431,否则进行步骤440 ;步骤440,把当前触发的连接请求事件放在共享队列里;在具体的实施过程中,若所述请求事件对应的端口不是当前端口,则把当前触发事件放到共享队列里,同时等待此连接请求事件发生。步骤431,打开新数据通讯端口 ;在具体的实施过程中,若所述事件触发是当前端口,则打开所述数据通讯端口,同时进行步骤441。步骤441,增加监听数据端口请求事件到事件数组。在具体的实施过程中,在打开了数据通信端口后,增加所述数据端口的所述连接请求事件到事件数组。另外,对于从共享队列里触发的连接请求事件,将会读取从事件端口过来的数据,在读完一条完整的数据后,基于轮转文件功能,把独到的数据写入到日志文件中去。下面请参考图5,其为本申请第一实施例中的输出日志的系统;在具体的实施过程中,所述系统应用于一 WEB服务器中,所述WEB服务器包括至少一个apache子进程,及一个server子进程,基于domain socket机制,在所述至少一个apache子进程中每个apache子进程与所述server子进程间建立有对应有数据接收端口的socket ;一个监听端口,用于监听所述至少一个apache子进程中是否有apache子进程发出连接请求。所述系统具体包括:连接请求接收模块,用于通过所述监听端口接收由所述至少一个apache子进程中一个子进程发送的连接请求;具体来说,所述连接请求接收模块具体可包括:绑定单元、用于基于预先设置的socket文件,绑定所述监听端口 ;监听单元、用于利用EPOLL功能,监听所述监听端口 ;接收单元、用于接收由所述至少一个apache子进程中一个子进程发送的连接请求。所述系统还包括:打开模块,用于基于所述连接请求,打开所述连接请求对应apache子进程对应的socket对应的数据接收端口 ;在具体的实施过程中,基于所述多个子进程发送连接请求的时间顺序,基于所述多个子进程中每个子进程发送的连接请求,打开所述多个子进程中每个子进程的连接请求对应apache子进程对应的socket对应的数据接收端口。
所述系统还包括:日志数据包接收模块,用于接收由所述连接请求对应apache子进程发送来的日志数据包;在具体的实施过程中,基于epoll_wait给的事件触发顺序,接收由所述连接请求中每个连接请求对应apache子进程发送来的日志数据包的模块。所述系统还包括:日志文件生成模块,用于在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,将所述日志数据包写成日志文件。在具体的实施过程中,在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,采用所述server子进程的轮转文件功能,将所述日志数据包写成日志文件。通过本申请上述的一个或多个实施例,具有如下技术效果:一、通过采用domain socket和server/client机制记录日志,解决了在传统的日志记录方式中,日志内容超过4k时,输出日志错乱的技术问题,达到了准确输出日志的技术效果;二、由于在记录日志时,将数据长度写到包头,解决了现有技术中对日志长度的限制,满足了输出的日志对日志长度在特殊要求应用场景下的扩展性需要;三、通过同时采用正常的server/client机制和原有封装的日志记录模式,使得在server服务异常的时候,能够撤回到原有的封装记录日志模式,使得记录日志方式包含各错和后补机制。本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
权利要求
1.一种输出日志的方法,其特征在于,应用于一 WEB服务器中,所述WEB服务器包括至少一个apache子进程,及一个server子进程,基于domain socket机制,在所述至少一个apache子进程中每个apache子进程与所述server子进程间建立有对应有数据接收端口的socket ;一个监听端口,用于监听所述至少一个apache子进程中是否有apache子进程发出连接请求,所述方法包括: 通过所述监听端口接收由所述至少一个apache子进程中一个子进程发送的连接请求; 基于所述连接请求,打开所述连接请求对应apache子进程对应的socket对应的数据接收端口 ; 接收由所述连接请求对应apache子进程发送来的日志数据包; 在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,将所述日志数据包写成日志文件。
2.如权利要求1所述的方法,其特征在于,所述通过所述监听端口接收由所述至少一个apache子进程中一个子进程发送的连接请求,具体包括: 基于预先配置的socket文件,绑定所述监听端口 ; 利用EPOLL功能,监听所述监听端口 ; 接收由所述至少一个apache子进程中一个子进程发送的连接请求。
3.如权利要求1所述的方法,其特征在于,在所述至少一个apache子进程为多个子进程时,所述基于所述连接 请求,打开所述连接请求对应apache子进程对应的socket对应的数据接收端口,具体为: 基于所述多个子进程发送连接请求的时间顺序,基于所述多个子进程中每个子进程发送的连接请求,打开所述多个子进程中每个子进程的连接请求对应apache子进程对应的socket对应的数据接收端口。
4.如权利要求1、2或3所述的方法,其特征在于,所述接收由所述连接请求对应apache子进程发送来的日志数据包,具体为: 基于epoll_wait给的事件触发顺序,接收由所述连接请求中每个连接请求对应apache子进程发送来的日志数据包。
5.如权利要求1、2或3所述的方法,其特征在于,所述在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,将所述日志数据包写成日志文件,具体为: 在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,采用所述server子进程的轮转文件功能,将所述日志数据包写成日志文件。
6.如权利要求1所述的方法,其特征在于,所述WEB服务器还包括与所述至少一个apache子进程连接的pipe,与所述pipe连接的cronlog子进程,所述至少一个apache子进程中每个apache子进程为: 在所述server子进程不响应连接请求或接收日志数据包失败时,通过所述pipe将日志数据包发送给所述cronlog子进程的进程。
7.一种输出日志的系统,应用于一 WEB服务器中,所述WEB服务器包括至少一个apache子进程,及一个server子进程,基于domain socket机制,在所述至少一个apache子进程中每个apache子进程与所述server子进程间建立有对应有数据接收端口的socket ;一个监听端口,用于监听所述至少一个apache子进程中是否有apache子进程发出连接请求,其特征在于,所述系统包括: 连接请求接收模块,用于通过所述监听端口接收由所述至少一个apache子进程中一个子进程发送的连接请求; 打开模块,用于基于所述连接请求,打开所述连接请求对应apache子进程对应的socket对应的数据接收端口 ; 日志数据包接收模块,用于接收由所述连接请求对应apache子进程发送来的日志数据包; 日志文件生成模块,用于在接收到日志数据包的数据长度达到所述日志数据包的包头中包含的数据长度值时,将所述日志数据包写成日志文件。
8.如权利要去7所述的系统,其特征在于,所述连接请求接收模块具体包括: 绑定单元、用于基于预先设置的socket文件,绑定所述监听端口 ; 监听单元、用于利用EPOLL功能,监听所述监听端口 ; 接收单元、用于接收由所述至少一个apache子进程中一个子进程发送的连接请求。
9.如权利要求7所述的系统,其特征在于,所述打开模块具体用于: 基于所述多个子进程发送连接请求的时间顺序,基于所述多个子进程中每个子进程发送的连接请求,打开所述多个子进程中每个子进程的连接请求对应apache子进程对应的socket对应的数据接收端口。
10.如权利要求7或8或9所述的系统,其特征在于,所述日志数据包接模块具体用于: 基于epoll_wait给的事件触发顺序,接收由所述连接请求中每个连接请求对应apache子进程发送来的日志数据包的模块。
全文摘要
本申请提供了一种输出日志的方法及系统,应用于一WEB服务器中,WEB服务器包括至少一个apache子进程,及一个server子进程,所述方法包括通过监听端口接收由至少一个apache子进程中一个子进程发送的连接请求;基于连接请求,打开连接请求对应apache子进程对应的socket对应的数据接收端口;接收由连接请求对应apache子进程发送来的日志数据包;在接收到日志数据包的数据长度达到日志数据包的包头中包含的数据长度值时,将日志数据包写成日志文件。
文档编号H04L29/08GK103179162SQ20111043756
公开日2013年6月26日 申请日期2011年12月23日 优先权日2011年12月23日
发明者徐绿兵, 刘晓溪, 甄颖珊, 张振中, 刘勇 申请人:阿里巴巴集团控股有限公司