本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種基于雙線程的日志輸出方法及裝置。
背景技術(shù):
開(kāi)發(fā)人員了解應(yīng)用程序(Application,簡(jiǎn)稱:APP)的運(yùn)行狀況,其中一種常規(guī)的方法是通過(guò)日志,將日志進(jìn)行重定向,輸出至指定的日志文件進(jìn)行統(tǒng)一收集。
現(xiàn)有技術(shù)中,在日志輸出的時(shí)候,啟動(dòng)一個(gè)線程,在該線程中打開(kāi)日志文件,接著把日志數(shù)據(jù)寫入到日志文件中,最后關(guān)閉日志文件,結(jié)束線程。因此,每寫一條日志,就需要經(jīng)歷一次日志文件的流程“打開(kāi)文件句柄--寫入數(shù)據(jù)—關(guān)閉文件句柄”。
但是,當(dāng)大量連續(xù)的日志輸出時(shí),通過(guò)上述日志輸出方法,容易導(dǎo)致讀寫文件頻繁,給系統(tǒng)輸入輸出(I/O)帶來(lái)壓力,且處理日志使用的線程數(shù)過(guò)多,會(huì)消耗移動(dòng)設(shè)備寶貴的線程資源,降低CPU分配給業(yè)務(wù)處理的時(shí)間片。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種基于雙線程的日志輸出方法及裝置,以解決現(xiàn)有日志輸出方法易導(dǎo)致讀寫文件頻繁,系統(tǒng)I/O壓力大的問(wèn)題。
第一方面,本發(fā)明提供一種基于雙線程的日志輸出方法,包括:
接收日志調(diào)用請(qǐng)求,將所述日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)存儲(chǔ)在線程循環(huán)隊(duì)列中;
將所述線程循環(huán)隊(duì)列中存儲(chǔ)的日志文本數(shù)據(jù)寫入阻塞隊(duì)列,所述阻塞隊(duì)列為內(nèi)存緩沖區(qū);
監(jiān)聽(tīng)所述阻塞隊(duì)列的容量和寫入操作,若監(jiān)聽(tīng)到所述阻塞隊(duì)列沒(méi)有寫入操作或者達(dá)到容量閾值,則觸發(fā)日志的輸入輸出線程,將所述阻塞隊(duì)列中當(dāng)前所有的日志文本數(shù)據(jù)一次性寫入日志文件。
進(jìn)一步地,所述將所述阻塞隊(duì)列中當(dāng)前所有的日志文本數(shù)據(jù)一次性寫入日志文件,包括:
打開(kāi)日志文件句柄,從所述阻塞隊(duì)列中依次獲取當(dāng)前所有的日志文本數(shù)據(jù),依次寫入每一日志文本數(shù)據(jù)到所述日志文件中,當(dāng)前所有的日志文本數(shù)據(jù)寫入所述日志文件結(jié)束時(shí),關(guān)閉所述日志文件句柄。
進(jìn)一步地,所述接收日志調(diào)用請(qǐng)求之前,還包括:
設(shè)置所述線程循環(huán)隊(duì)列的線程優(yōu)先級(jí)低于業(yè)務(wù)處理的優(yōu)先級(jí)。
進(jìn)一步地,所述監(jiān)聽(tīng)到所述阻塞隊(duì)列沒(méi)有寫入操作,包括:
監(jiān)聽(tīng)到所述阻塞隊(duì)列在預(yù)設(shè)時(shí)間內(nèi)沒(méi)有寫入操作。
第二方面,本發(fā)明提供一種基于雙線程的日志輸出裝置,包括:
接收模塊,用于接收日志調(diào)用請(qǐng)求;
線程循環(huán)隊(duì)列,用于存儲(chǔ)所述日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù);
阻塞隊(duì)列,用于存儲(chǔ)所述線程循環(huán)隊(duì)列中的日志文本數(shù)據(jù),所述阻塞隊(duì)列為內(nèi)存緩沖區(qū);
觸發(fā)模塊,用于監(jiān)聽(tīng)所述阻塞隊(duì)列的容量和寫入操作,若監(jiān)聽(tīng)到所述阻塞隊(duì)列沒(méi)有寫入操作或者達(dá)到容量閾值,則觸發(fā)日志的輸入輸出線程;
日志寫入模塊,用于將所述阻塞隊(duì)列中當(dāng)前所有的日志文本數(shù)據(jù)一次性寫入日志文件。
進(jìn)一步地,所述日志寫入模塊具體用于:
打開(kāi)日志文件句柄,從所述阻塞隊(duì)列中依次獲取當(dāng)前所有日志文本數(shù)據(jù),依次寫入每一日志文本數(shù)據(jù)到所述日志文件中,當(dāng)前所有日志文本數(shù)據(jù)寫入所述日志文件結(jié)束時(shí),關(guān)閉所述日志文件句柄。
進(jìn)一步地,還包括:
設(shè)置模塊,用于在所述接收模塊接收日志調(diào)用請(qǐng)求之前,設(shè)置所述線程循環(huán)隊(duì)列的線程優(yōu)先級(jí)低于業(yè)務(wù)處理的優(yōu)先級(jí)。
進(jìn)一步地,所述觸發(fā)模塊具體用于:
監(jiān)聽(tīng)到所述阻塞隊(duì)列在預(yù)設(shè)時(shí)間內(nèi)沒(méi)有寫入操作。
本發(fā)明提供的基于雙線程的日志輸出方法及裝置,通過(guò)接收日志調(diào)用請(qǐng)求后,使用一個(gè)線程將日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)寫入內(nèi)存緩沖區(qū),一個(gè)線程監(jiān)聽(tīng)內(nèi)存緩沖區(qū)在沒(méi)有寫入操作或者達(dá)到容量閾值時(shí)將內(nèi)存緩沖區(qū)中的日志文本數(shù)據(jù)一次性寫入日志文件中,日志緩存和寫入分別在兩個(gè)工作子線程中。從而,內(nèi)存緩沖區(qū)數(shù)據(jù)寫入日志文件的頻率低,降低了處理日志使用的線程數(shù),對(duì)系統(tǒng)I/O壓力小,實(shí)現(xiàn)了用較少的CPU和線程資源實(shí)現(xiàn)日志的重定向,提高應(yīng)用內(nèi)UI交互的響應(yīng)性能。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明基于雙線程的日志輸出方法實(shí)施例一的流程圖;
圖2為本發(fā)明基于雙線程的日志輸出方法實(shí)施例二的交互流程圖;
圖3為本發(fā)明基于雙線程的日志輸出裝置實(shí)施例一的結(jié)構(gòu)示意圖;
圖4為本發(fā)明基于雙線程的日志輸出裝置實(shí)施例二的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明中的附圖,對(duì)本發(fā)明中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
圖1為本發(fā)明基于雙線程的日志輸出方法實(shí)施例一的流程圖,本實(shí)施例的執(zhí)行主體可以為終端設(shè)備,如手機(jī)、IPAD等電子設(shè)備,如圖1所示,本實(shí)施例的方法可以包括:
S101、接收日志調(diào)用請(qǐng)求,將日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)存儲(chǔ)在線程循環(huán)隊(duì)列中。
其中,線程循環(huán)隊(duì)列用于按照隊(duì)列先入先出存儲(chǔ)接收到的日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù),在日志輸出的時(shí)候,要啟動(dòng)一個(gè)線程,該日志調(diào)用請(qǐng)求就是日志輸出前的線程調(diào)用請(qǐng)求。
S102、將線程循環(huán)隊(duì)列中存儲(chǔ)的日志文本數(shù)據(jù)寫入阻塞隊(duì)列,阻塞隊(duì)列為內(nèi)存緩沖區(qū)。
其中,內(nèi)存緩沖區(qū)例如為高速內(nèi)存緩沖區(qū)。
S103、監(jiān)聽(tīng)阻塞隊(duì)列的容量和寫入操作,若監(jiān)聽(tīng)到阻塞隊(duì)列沒(méi)有寫入操作或者達(dá)到容量閾值,則觸發(fā)日志的輸入輸出線程,將阻塞隊(duì)列中當(dāng)前所有的日志文本數(shù)據(jù)一次性寫入日志文件。
具體地,若監(jiān)聽(tīng)到阻塞隊(duì)列沒(méi)有寫入操作或者達(dá)到容量閾值,將阻塞隊(duì)列中當(dāng)前所有的日志文本數(shù)據(jù)一次性寫入日志文件,具體可以為:
打開(kāi)日志文件句柄,從阻塞隊(duì)列中依次獲取當(dāng)前所有的日志文本數(shù)據(jù),依次寫入每一線程對(duì)應(yīng)的日志數(shù)據(jù)到日志文件中,當(dāng)前所有的日志文本數(shù)據(jù)寫入日志文件結(jié)束時(shí),關(guān)閉日志文件句柄。其中的容量閾值例如為阻塞隊(duì)列容量的80%或者90%等等。
從而,阻塞隊(duì)列中當(dāng)前所有的日志文本數(shù)據(jù)一次性全部寫入日志文件,而日志文件句柄的打開(kāi)和關(guān)閉只需各執(zhí)行一次,因此日志文本數(shù)據(jù)寫入日志文件的頻率低,對(duì)系統(tǒng)的I/O壓力小。
進(jìn)一步地,監(jiān)聽(tīng)到阻塞隊(duì)列沒(méi)有寫入操作,可以為:監(jiān)聽(tīng)到阻塞隊(duì)列在預(yù)設(shè)時(shí)間內(nèi)沒(méi)有寫入操作,預(yù)設(shè)時(shí)間可以是預(yù)設(shè)的一個(gè)時(shí)間段,如5S。
本實(shí)施例中,可以看出,采用本實(shí)施例的日志輸出方法,雙線程異步寫數(shù)據(jù),一個(gè)線程負(fù)責(zé)將日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)寫入內(nèi)存緩沖區(qū),一個(gè)線程負(fù)責(zé)監(jiān)聽(tīng)內(nèi)存緩沖區(qū)在滿足觸發(fā)條件時(shí)將內(nèi)存緩沖區(qū)中的日志文本數(shù)據(jù)一次性寫入日志文件中,日志緩存和寫入分別在兩個(gè)工作子線程中,緩沖區(qū)數(shù)據(jù)寫入日志文件(即磁盤文件)的頻率低,降低了處理日志使用的線程數(shù),對(duì)系統(tǒng)I/O壓力小,用較少的CPU和線程資源實(shí)現(xiàn)日志的重定向,提高應(yīng)用內(nèi)用戶界面(User Interface,簡(jiǎn)稱:UI)交互的響應(yīng)性能。
進(jìn)一步地,在S101中接收日志調(diào)用請(qǐng)求之前,還可以包括:設(shè)置線程循環(huán)隊(duì)列的線程優(yōu)先級(jí)低于業(yè)務(wù)處理的優(yōu)先級(jí)。從而終端設(shè)備在同時(shí)接收到日志調(diào)用請(qǐng)求和業(yè)務(wù)處理請(qǐng)求時(shí),可以優(yōu)先處理業(yè)務(wù),不影響業(yè)務(wù)處理的時(shí)間。
本實(shí)施例提供的基于雙線程的日志輸出方法,通過(guò)接收日志調(diào)用請(qǐng)求后,使用一個(gè)線程將日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)寫入內(nèi)存緩沖區(qū),一個(gè)線程監(jiān)聽(tīng)內(nèi)存緩沖區(qū)在沒(méi)有寫入操作或者達(dá)到容量閾值時(shí)將內(nèi)存緩沖區(qū)中的日志文本數(shù)據(jù)一次性寫入日志文件中,日志緩存和寫入分別在兩個(gè)工作子線程中。從而,內(nèi)存緩沖區(qū)數(shù)據(jù)寫入日志文件的頻率低,降低了處理日志使用的線程數(shù),對(duì)系統(tǒng)I/O壓力小,實(shí)現(xiàn)了用較少的CPU和線程資源實(shí)現(xiàn)日志的重定向,提高應(yīng)用內(nèi)UI交互的響應(yīng)性能。
下面采用一個(gè)具體的實(shí)施例,對(duì)圖1所示方法實(shí)施例的技術(shù)方案進(jìn)行詳細(xì)說(shuō)明。
圖2為本發(fā)明基于雙線程的日志輸出方法實(shí)施例二的交互流程圖,如圖2所示,本實(shí)施例的方法可以包括:
S201、接收日志調(diào)用請(qǐng)求。
S202、啟動(dòng)線程循環(huán)隊(duì)列,將日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)存儲(chǔ)在線程循環(huán)隊(duì)列中。
S203、日志文本數(shù)據(jù)寫入阻塞隊(duì)列。
具體地,將線程循環(huán)隊(duì)列中存儲(chǔ)的日志文本數(shù)據(jù)寫入阻塞隊(duì)列,阻塞隊(duì)列為內(nèi)存緩沖區(qū)。
S204、監(jiān)聽(tīng)阻塞隊(duì)列的容量和寫入操作。
若監(jiān)聽(tīng)到阻塞隊(duì)列沒(méi)有寫入操作或者達(dá)到容量閾值,則觸發(fā)日志的輸入輸出線程,執(zhí)行S205。
S205、循環(huán)從阻塞隊(duì)列獲取隊(duì)首的消息。
S206、將獲取的日志文本數(shù)據(jù)寫入到一文件中。
S207、接收到獲取阻塞隊(duì)列中的線程全部結(jié)束后,將該文件中的數(shù)據(jù)一次性刷入日志文件中。
圖3為本發(fā)明基于雙線程的日志輸出裝置實(shí)施例一的結(jié)構(gòu)示意圖,如圖3所示,本實(shí)施例的裝置可以包括:接收模塊11、線程循環(huán)隊(duì)列12、阻塞隊(duì)列13、觸發(fā)模塊14和日志寫入模塊15。
其中,接收模塊11用于接收日志調(diào)用請(qǐng)求。線程循環(huán)隊(duì)列12用于存儲(chǔ)日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)。阻塞隊(duì)列13用于存儲(chǔ)線程循環(huán)隊(duì)列中的日志文本數(shù)據(jù),阻塞隊(duì)列為內(nèi)存緩沖區(qū)。觸發(fā)模塊14用于監(jiān)聽(tīng)阻塞隊(duì)列的容量和寫入操作,若監(jiān)聽(tīng)到阻塞隊(duì)列沒(méi)有寫入操作或者達(dá)到容量閾值,則觸發(fā)日志的輸入輸出線程。日志寫入模塊15用于將阻塞隊(duì)列中當(dāng)前所有的日志文本數(shù)據(jù)一次性寫入日志文件。
進(jìn)一步地,日志寫入模塊15具體用于:打開(kāi)日志文件句柄,從阻塞隊(duì)列中依次獲取當(dāng)前所有的日志文本數(shù)據(jù),依次寫入每一日志文本數(shù)據(jù)到日志文件中,當(dāng)前所有日志文本數(shù)據(jù)寫入日志文件結(jié)束時(shí),關(guān)閉日志文件句柄。
本實(shí)施例的裝置,可以用于執(zhí)行圖1所示方法實(shí)施例的技術(shù)方案,其實(shí)現(xiàn)原理類似,此處不再贅述。
本實(shí)施例提供的基于雙線程的日志輸出裝置,通過(guò)接收日志調(diào)用請(qǐng)求后,使用一個(gè)線程將日志調(diào)用請(qǐng)求中的日志文本數(shù)據(jù)寫入內(nèi)存緩沖區(qū),一個(gè)線程監(jiān)聽(tīng)內(nèi)存緩沖區(qū)在沒(méi)有寫入操作或者達(dá)到容量閾值時(shí)將內(nèi)存緩沖區(qū)中的日志文本數(shù)據(jù)一次性寫入日志文件中,日志緩存和寫入分別在兩個(gè)工作子線程中。從而,內(nèi)存緩沖區(qū)數(shù)據(jù)寫入日志文件的頻率低,降低了處理日志使用的線程數(shù),對(duì)系統(tǒng)I/O壓力小,實(shí)現(xiàn)了用較少的CPU和線程資源實(shí)現(xiàn)日志的重定向,提高應(yīng)用內(nèi)UI交互的響應(yīng)性能。
圖4為本發(fā)明基于雙線程的日志輸出裝置實(shí)施例二的結(jié)構(gòu)示意圖,如圖4所示,本實(shí)施例的裝置在圖3所示裝置結(jié)構(gòu)的基礎(chǔ)上,進(jìn)一步地,還可以包括:設(shè)置模塊16,該設(shè)置模塊16用于在接收模塊11接收日志調(diào)用請(qǐng)求之前,設(shè)置線程循環(huán)隊(duì)列的線程優(yōu)先級(jí)低于業(yè)務(wù)處理的優(yōu)先級(jí)。
進(jìn)一步地,觸發(fā)模塊14具體用于:監(jiān)聽(tīng)到阻塞隊(duì)列在預(yù)設(shè)時(shí)間內(nèi)沒(méi)有寫入操作。
本實(shí)施例的裝置,可以用于執(zhí)行圖1所示方法實(shí)施例的技術(shù)方案,其實(shí)現(xiàn)原理類似,此處不再贅述。
本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述各方法實(shí)施例的全部或部分步驟可以通過(guò)程序指令相關(guān)的硬件來(lái)完成。前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。該程序在執(zhí)行時(shí),執(zhí)行包括上述各方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括:ROM、RAM、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
最后應(yīng)說(shuō)明的是:以上各實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述各實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍。