CN103885726A - 一种高效的多线程日志写入方法 - Google Patents
一种高效的多线程日志写入方法 Download PDFInfo
- Publication number
- CN103885726A CN103885726A CN201410103710.7A CN201410103710A CN103885726A CN 103885726 A CN103885726 A CN 103885726A CN 201410103710 A CN201410103710 A CN 201410103710A CN 103885726 A CN103885726 A CN 103885726A
- Authority
- CN
- China
- Prior art keywords
- buffer zone
- log information
- rear end
- daily record
- write
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及一种高效的多线程日志写入方法,使用到供应用程序使用的接口,并生成日志信息的前端和负责把日志消息写入到本地文件的后端;步骤1、初始化所述前端的缓冲区和所述后端的缓冲区;步骤2、所述前端负责往所述前端的缓冲区填日志消息;步骤3、所述后端将后端的缓冲区的日志数据写入本地文件中;步骤4、当所述前端的缓冲区写满后,交换所述前端的缓冲区和所述后端的缓冲区,让所述后端将其缓冲区的数据写入本地文件,而所述前端往其缓冲区填入新的日志消息,如此往复。本发明方法可以每秒写几千上万条日志的时候没有明显的性能损失、能应对一个进程产生大量日志数据的场景、不阻塞正常的执行流程以及在多线程程序中,不造成锁争用等。
Description
技术领域
本发明涉及属于计算机编程领域,更具体地说是通过多线程异步方法实现一种高效的日志写入方法。
背景技术
“日志”属于是计算机编程领域常用的日志库提供的日志功能,即文本的、供人阅读的日志,通常用于故障诊断和追踪,也可用于性能分析。目前,一般在服务器编程中,日志是必不可少的。在生产环境中日志通常要记录收到每条内部消息的id、收到每条外部消息的全文、关键内部状态的变更,等等。每条日志都有时间戳,这样就能完整追踪系统中的一个事件的来龙去脉,也只有这样才能查清楚发生故障时究竟发生了什么,比如业务处理流程卡在了哪一步。
多线程程序对日志库提出了新的需求:线程安全,即多个线程可以并发写日志,两个线程的日志消息不会出现交织。线程安全不难做到,简单的办法是用一个全局mutex保护IO,或者每个线程单独写一个日志文件,现有的方法已经获得了广泛应用。但是在可靠性和高效性方面仍有较大的应用瓶颈:
(1)用一个全局的mutex保护IO,会造成全部线程抢一个锁,所有线程抢一个锁会增加锁之间的上下文切换时间,从而降低效率。
(2)用每一个线程单独写一个日志,有可能造成业务线程阻塞在写磁盘操作上,从而影响业务层响应时间。
发明内容
本发明设计了一种高效的多线程日志写入方法,其解决的技术问题是现有技术中所有线程争抢一个锁以及造成业务线程阻塞在写磁盘操作上的缺点。
为了解决上述存在的技术问题,本发明采用了以下方案:
一种高效的多线程日志写入方法,该方法中使用到供应用程序使用的接口,并生成日志信息的前端和负责把日志消息写入到本地文件的后端;包括以下步骤:步骤1、采用双缓冲技术,初始化所述前端的缓冲区和所述后端的缓冲区;采用所述双缓冲目的在于在新建日志消息的时不必要等待磁盘文件操作,也避免每条新日志消息都触发所述后端日志线程;步骤2、所述前端负责往所述前端的缓冲区填日志消息;步骤3、所述后端将后端的缓冲区的日志数据写入本地文件中;步骤4、当所述前端的缓冲区写满后,交换所述前端的缓冲区和所述后端的缓冲区,让所述后端将其缓冲区的数据写入本地文件,而所述前端往其缓冲区填入新的日志消息,如此往复。
进一步,为了及时将日志消息写入本地文件,即使所述前端缓冲区未满,也会每N秒执行一次上述步骤4的交换写入操作。
进一步,N为3。
该高效的多线程日志写入方法具有以下有益效果:
(1)本发明方法优点在于每秒写几千上万条日志的时候没有明显的性能损失、能应对一个进程产生大量日志数据的场景、不阻塞正常的执行流程以及在多线程程序中,不造成锁争用等。因此,满足了高效日志写入本地文件的部署需求。
(2)本发明方法步骤1中采用双缓冲的好处是在新建日志消息的时候不必要等待磁盘文件操作,也避免每条新日志消息都触发所述后端日志线程。换言之,所述前端不是将一条条日志消息分别传送给所述后端,而是将多条日志消息拼成一个大的缓冲区传送给所述后端,相当于批处理,减少了线程唤醒的频繁度,降低开销。
(2)本发明方法步骤4中往本地文件中写日志的一个常见问题是,万一程序崩溃,那么最后若干条日志往往就会丢失,因为本方法不能每条消息都flush本地文件,更不能每条日志都open/close文件,这样性能开销太大。本发明方法每3秒执行交换写入操作的好处是万一程序真崩溃,那么3秒前日志就不会丢失。
附图说明
图1是本发明方法中所述前端写日志频度不高,所述后端3秒超时后将所述前端缓冲区写入本地文件的运行图;
图2是本发明方法中所述前端写日志频度比较高,在3秒超时之前已经写满了所述前端缓冲区,之后唤醒所述后端开始写入本地文件的运行图;
图3是本发明方法中所述前端写日志频度非常高,用完了所述的前端缓冲区后,重新分配一块新的缓冲区的运行图。
具体实施方式
下面结合图1至图3,对本发明做进一步说明:
本发明提供一种高效的多线程日志写入方法,本发明包括供应用程序使用的接口,并生成日志信息的前端和负责把日志消息写入到本地文件的后端。该方法具体实施包括以下步骤:
一、初始化所述前端和后端共4个缓冲区以及待写入文件的已填满的缓冲区队列,包括当前缓冲区currentBuffer、预备缓冲区nextBuffer、空闲缓冲区newBuffer1、空闲缓冲区newBuffer2和待写入文件的已填满的缓冲区队列buffers。前端有当前缓冲区currentBuffer、预备缓冲区nextBuffer以及前端待写入文件的已填满的缓冲区队列buffers,后端有空闲缓冲区newBuffer1、空闲缓冲区newBuffer2和后端待写入文件的已填满的缓冲区队列buffers。
二、所述前端负责往前端各个缓冲区填日志消息,若所述前端写日志的频度不高,所述后端3秒超时后将所述前端缓冲区写入本地文件,如图1所示。
在第2.9秒的时候,当前缓冲区currentBuffer使用了80%,在第3秒的时候所述后端线程醒过来,先把当前缓冲区currentBuffer中的日志信息送入前端的buffers,再把空闲缓冲区newBuffer1中的数据移动至当前缓冲区currentBuffer。随后第3+秒,所述后端开始将后端的buffers写入文件。写完之后再把空闲缓冲区newBuffer1重新填上,等待下一次唤醒。
由此可见,图中1中前端写日志的频度不高时,前端的部分缓冲区中数据与后端的部分缓冲区中数据进行了交换。也就是,前缓冲区currentBuffer与空闲缓冲区newBuffer1中的数据之间进行了交换。
三、所述前端写日志频度比较高,在3秒超时之前已经写满了所述前端缓冲区,如图2所示。
在第1.8秒的时候,当前缓冲区currentBuffer写满了,于是将当前缓冲区currentBuffer送入前端的buffers,并将预备缓冲区nextBuffer移用为当前缓冲区,然后唤醒所述后端线程开始写入。当后端线程唤醒之后(第1.8+秒),先将当前缓冲区currentBuffer中的数据送入后端的buffers,再把空闲缓冲区newBuffer1中的数据移至当前缓冲区currentBuffer,最后空闲缓冲区newBuffer2中的数据移动至预备缓冲区nextBuffer,即保证所述前端有两个空缓冲区可用。
四、若所述前端写日志频度非常高,用完了所述的前端缓冲区,如图3所示。
在第1.8秒的时候,当前缓冲区currentBuffer中缓冲A已经写满,预备缓冲区nextBuffer中缓冲B也接近写满,到了第1.9秒,预备缓冲区nextBuffer也已经写满,所述前端新分配了当前缓冲区currentBuffer用于写E。到了第1.8+秒,所述后端线程获得控制权,将后端有空闲缓冲区newBuffer1和空闲缓冲区newBuffer2中的C、D两块缓冲交给所述前端,并开始将A、B、E缓冲依次写入文件。一段时间之后,完成写入操作,用A、B重新填充空闲缓冲区newBuffer1和空闲缓冲区newBuffer2。
由此可见,图2和图3中分别为前端写日志的频度比较高和非常高时,前端的所有缓冲区中数据与后端的所有缓冲区中数据进行了交换。不仅当前缓冲区currentBuffer与空闲缓冲区newBuffer2中的数据之间进行了交换,而且预备缓冲区nextBurfer与空闲缓冲区newBuffer1中的数据之间进行了交换。
本发明高效多线程日志写入方法具有以下优点:
1、每秒写几千上万条日志的时候没有明显的性能损失。
2、能应对一个进程产生大量日志数据的场景。
3、在多线程程序中,不造成锁争用。
上面结合附图对本发明进行了示例性的描述,显然本发明的实现并不受上述方式的限制,只要采用了本发明的方法构思和技术方案进行的各种改进,或未经改进将本发明的构思和技术方案直接应用于其它场合的,均在本发明的保护范围内。
Claims (3)
1.一种高效的多线程日志写入方法,该方法中使用到供应用程序使用的接口,并生成日志信息的前端和负责把日志消息写入到本地文件的后端;包括以下步骤:步骤1、采用双缓冲技术,初始化所述前端的缓冲区和所述后端的缓冲区;采用所述双缓冲目的在于在新建日志消息的时不必要等待磁盘文件操作,也避免每条新日志消息都触发所述后端日志线程;步骤2、所述前端负责往所述前端的缓冲区填日志消息;步骤3、所述后端将后端的缓冲区的日志数据写入本地文件中;步骤4、当所述前端的缓冲区写满后,交换所述前端的缓冲区和所述后端的缓冲区,让所述后端将其缓冲区的数据写入本地文件,而所述前端往其缓冲区填入新的日志消息,如此往复。
2.根据权利要求1所述高效的多线程日志写入方法,其特征在于:为了及时将日志消息写入本地文件,即使所述前端缓冲区未满,也会每N秒执行一次上述步骤4的交换写入操作。
3.根据权利要求1所述高效的多线程日志写入方法,其特征在于:N为3。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410103710.7A CN103885726B (zh) | 2014-03-20 | 2014-03-20 | 一种高效的多线程日志写入方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410103710.7A CN103885726B (zh) | 2014-03-20 | 2014-03-20 | 一种高效的多线程日志写入方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103885726A true CN103885726A (zh) | 2014-06-25 |
CN103885726B CN103885726B (zh) | 2017-07-21 |
Family
ID=50954646
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410103710.7A Expired - Fee Related CN103885726B (zh) | 2014-03-20 | 2014-03-20 | 一种高效的多线程日志写入方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103885726B (zh) |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104537074A (zh) * | 2014-12-31 | 2015-04-22 | 天津南大通用数据技术股份有限公司 | 一种提高数据库系统写日志性能的方法 |
CN106202307A (zh) * | 2016-07-01 | 2016-12-07 | 百势软件(北京)有限公司 | 一种批量日志保存方法及装置 |
CN106681658A (zh) * | 2016-11-25 | 2017-05-17 | 天津津航计算技术研究所 | 基于多线程实现数据记录仪海量数据高速转存的方法 |
CN106708578A (zh) * | 2016-12-23 | 2017-05-24 | 北京五八信息技术有限公司 | 基于双线程的日志输出方法及装置 |
CN107153695A (zh) * | 2017-05-05 | 2017-09-12 | 恒生电子股份有限公司 | 日志记录方法及装置、电子设备、存储介质 |
CN107180051A (zh) * | 2016-03-11 | 2017-09-19 | 华为技术有限公司 | 一种日志管理方法、服务器 |
CN108664340A (zh) * | 2018-04-16 | 2018-10-16 | 北京酷我科技有限公司 | 一种多线程日志发送管理的方法 |
CN108804295A (zh) * | 2017-04-28 | 2018-11-13 | 北京京东尚科信息技术有限公司 | 日志信息记录方法和装置 |
CN110389933A (zh) * | 2019-07-01 | 2019-10-29 | 京信通信系统(中国)有限公司 | 一种进程间的日志管理方法及装置 |
CN110737531A (zh) * | 2019-09-27 | 2020-01-31 | 山东英信计算机技术有限公司 | 一种故障诊断方法、装置、设备及介质 |
CN112000583A (zh) * | 2020-09-17 | 2020-11-27 | 深圳市有方科技股份有限公司 | 一种调试信息抓取方法及其装置 |
CN112015827A (zh) * | 2019-05-30 | 2020-12-01 | 中兴通讯股份有限公司 | 一种数据库处理方法、装置及计算机可读存储介质 |
CN112445431A (zh) * | 2020-11-16 | 2021-03-05 | 深圳市元征科技股份有限公司 | 数据存储方法、装置、设备及介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2004017205A1 (ja) * | 2002-08-14 | 2004-02-26 | Access Co., Ltd. | ログ記録方法、ファイル管理プログラム、および情報機器 |
CN103309858A (zh) * | 2012-03-06 | 2013-09-18 | 深圳市腾讯计算机系统有限公司 | 一种多线程日志管理的方法及装置 |
CN103309767A (zh) * | 2012-03-08 | 2013-09-18 | 阿里巴巴集团控股有限公司 | 一种客户端日志处理方法和装置 |
CN103577158A (zh) * | 2012-07-18 | 2014-02-12 | 阿里巴巴集团控股有限公司 | 数据处理方法与装置 |
-
2014
- 2014-03-20 CN CN201410103710.7A patent/CN103885726B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2004017205A1 (ja) * | 2002-08-14 | 2004-02-26 | Access Co., Ltd. | ログ記録方法、ファイル管理プログラム、および情報機器 |
CN103309858A (zh) * | 2012-03-06 | 2013-09-18 | 深圳市腾讯计算机系统有限公司 | 一种多线程日志管理的方法及装置 |
CN103309767A (zh) * | 2012-03-08 | 2013-09-18 | 阿里巴巴集团控股有限公司 | 一种客户端日志处理方法和装置 |
CN103577158A (zh) * | 2012-07-18 | 2014-02-12 | 阿里巴巴集团控股有限公司 | 数据处理方法与装置 |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104537074A (zh) * | 2014-12-31 | 2015-04-22 | 天津南大通用数据技术股份有限公司 | 一种提高数据库系统写日志性能的方法 |
CN107180051A (zh) * | 2016-03-11 | 2017-09-19 | 华为技术有限公司 | 一种日志管理方法、服务器 |
CN106202307A (zh) * | 2016-07-01 | 2016-12-07 | 百势软件(北京)有限公司 | 一种批量日志保存方法及装置 |
CN106681658A (zh) * | 2016-11-25 | 2017-05-17 | 天津津航计算技术研究所 | 基于多线程实现数据记录仪海量数据高速转存的方法 |
CN106708578A (zh) * | 2016-12-23 | 2017-05-24 | 北京五八信息技术有限公司 | 基于双线程的日志输出方法及装置 |
CN106708578B (zh) * | 2016-12-23 | 2021-11-09 | 北京五八信息技术有限公司 | 基于双线程的日志输出方法及装置 |
CN108804295A (zh) * | 2017-04-28 | 2018-11-13 | 北京京东尚科信息技术有限公司 | 日志信息记录方法和装置 |
CN107153695A (zh) * | 2017-05-05 | 2017-09-12 | 恒生电子股份有限公司 | 日志记录方法及装置、电子设备、存储介质 |
CN108664340A (zh) * | 2018-04-16 | 2018-10-16 | 北京酷我科技有限公司 | 一种多线程日志发送管理的方法 |
CN108664340B (zh) * | 2018-04-16 | 2022-02-08 | 北京酷我科技有限公司 | 一种多线程日志发送管理的方法 |
WO2020238485A1 (zh) * | 2019-05-30 | 2020-12-03 | 中兴通讯股份有限公司 | 一种数据库处理方法、装置及计算机可读存储介质 |
CN112015827A (zh) * | 2019-05-30 | 2020-12-01 | 中兴通讯股份有限公司 | 一种数据库处理方法、装置及计算机可读存储介质 |
US11928132B2 (en) | 2019-05-30 | 2024-03-12 | Xi'an Zhongxing New Software Co., Ltd. | Database processing method and apparatus, and computer-readable storage medium |
CN110389933A (zh) * | 2019-07-01 | 2019-10-29 | 京信通信系统(中国)有限公司 | 一种进程间的日志管理方法及装置 |
CN110389933B (zh) * | 2019-07-01 | 2022-04-22 | 京信网络系统股份有限公司 | 一种进程间的日志管理方法及装置 |
CN110737531A (zh) * | 2019-09-27 | 2020-01-31 | 山东英信计算机技术有限公司 | 一种故障诊断方法、装置、设备及介质 |
CN112000583A (zh) * | 2020-09-17 | 2020-11-27 | 深圳市有方科技股份有限公司 | 一种调试信息抓取方法及其装置 |
CN112445431A (zh) * | 2020-11-16 | 2021-03-05 | 深圳市元征科技股份有限公司 | 数据存储方法、装置、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103885726B (zh) | 2017-07-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103885726A (zh) | 一种高效的多线程日志写入方法 | |
US9965014B2 (en) | Techniques for tracing wakelock usage | |
WO2016206600A1 (zh) | 一种信息流数据的处理方法和装置 | |
CN106708578B (zh) | 基于双线程的日志输出方法及装置 | |
CN103218176B (zh) | 数据处理方法及装置 | |
US9552221B1 (en) | Monitoring application execution using probe and profiling modules to collect timing and dependency information | |
US9753939B2 (en) | Data synchronization method and data synchronization system for multi-level associative storage architecture, and storage medium | |
CN103020257A (zh) | 数据操作的实现方法和装置 | |
CN103150149A (zh) | 处理数据库重做数据的方法和装置 | |
CN105574141B (zh) | 一种对数据库进行数据迁移的方法和装置 | |
CN102799212B (zh) | 用于多核多处理器并行系统的全局时钟系统及其使用方法 | |
CN111831383A (zh) | 窗口拼接方法、装置、设备以及存储介质 | |
CN103544076B (zh) | 一种数据备份方法及装置 | |
CN103514140B (zh) | 用于实现可重构系统中配置信息多发射的重构控制器 | |
US20150127931A1 (en) | Information processing apparatus, boot up method, and computer-readable storage medium storing boot up program | |
CN107391274A (zh) | 离线消息的处理方法及装置 | |
CN104199729A (zh) | 一种资源管理方法及系统 | |
CN103853827A (zh) | 一种保证数据一致性的数据库备份方法 | |
CN107368498A (zh) | 优化MySQL悲观锁的锁等待超时时间的方法及装置 | |
CN101692249A (zh) | 对电力需求侧系统进行数据存取的方法 | |
CN111966511A (zh) | 消息队列数据读写处理方法及装置 | |
CN102147786B (zh) | 一种双端口虚拟fifo数据交换的方法 | |
CN102750342A (zh) | 一种集群文件系统数据一致性的方法 | |
CN110457133A (zh) | 一种操作系统资源异常的处理方法及系统 | |
CN107193558B (zh) | 一种日志文件的生成方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170721 Termination date: 20180320 |
|
CF01 | Termination of patent right due to non-payment of annual fee |