两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種日志記錄方法和裝置與流程

文檔序號:11729396閱讀:171來源:國知局
一種日志記錄方法和裝置與流程

本發(fā)明涉及日志管理領(lǐng)域,尤其涉及一種日志記錄方法和裝置。



背景技術(shù):

在日常開發(fā)中,日志的記錄是必不可少的。對同一個文件進行寫日志只能單線程的去寫,通常會使用簡單的lock(鎖)來保證當(dāng)前時刻只有一個線程對同一個日志文件進行寫操作,從而保證日志輸出的正確性。但是這種方式的缺點也很明顯,就是系統(tǒng)在高并發(fā)的情況下,效率會非常的差。很容易導(dǎo)致系統(tǒng)性能瓶頸,降低系統(tǒng)處理能力。

即便使用多線程的處理方式來避免系統(tǒng)處理能力的下降,但是在多線程寫日志記錄的時候,由于日志記錄需要與磁盤i/o交互,導(dǎo)致單一線程占用鎖的時間會加長,從而導(dǎo)致大量線程的阻塞與等待,降低系統(tǒng)的處理能力。



技術(shù)實現(xiàn)要素:

本發(fā)明旨在解決上面描述的問題。

根據(jù)本發(fā)明的第一方面,一種日志記錄方法,包括:

為日志文件寫入任務(wù)分配緩存隊列組,所述緩存隊列組包含至少兩個緩存隊列;

選擇所述緩存隊列組中的至少一個緩存隊列作為當(dāng)前緩存隊列;

將所述當(dāng)前緩存隊列中的日志數(shù)據(jù)寫入磁盤中的日志文件,同時所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列獲取待寫入的日志數(shù)據(jù)。

優(yōu)選的,將所述當(dāng)前緩存隊列中的日志數(shù)據(jù)寫入磁盤中的日志文件,同時所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列獲取待寫入的日志數(shù)據(jù)包括:

創(chuàng)建i/o線程,進行所述當(dāng)前緩存隊列中的日志數(shù)據(jù)向日志文件中的寫入,在寫入期間對所述日志文件添加同步鎖,在寫入完成后解除該同步鎖;

創(chuàng)建邏輯線程,進行所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列對待寫入的日志數(shù)據(jù)的獲取。

優(yōu)選的,該方法還包括:

在所述當(dāng)前緩存隊列中的日志數(shù)據(jù)全部寫入完成后,從所述緩存隊列組中重新選擇當(dāng)前緩存隊列。

優(yōu)選的,該方法還包括:

所述邏輯線程在所述當(dāng)前緩存隊列中的日志數(shù)據(jù)全部寫入完成后,重新選擇當(dāng)前緩存隊列完成之前,對待寫入的日志數(shù)據(jù)的獲取添加同步鎖。

優(yōu)選的,該方法還包括:

對于多個日志文件寫入任務(wù),為每個日志文件寫入任務(wù)分別分配對應(yīng)的緩存隊列組。

根據(jù)本發(fā)明的另一方面,一種日志記錄裝置,包括:

隊列生成模塊,用于為日志文件寫入任務(wù)分配緩存隊列組,所述緩存隊列組包含至少兩個緩存隊列;

控制模塊,用于選擇所述緩存隊列組中的至少一個緩存隊列作為當(dāng)前緩存隊列;

讀寫管理模塊,用于將所述當(dāng)前緩存隊列中的日志數(shù)據(jù)寫入磁盤中的日志文件,同時所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列獲取待寫入的日志數(shù)據(jù)。

優(yōu)選的,所述讀寫管理模塊包括:

第一線程管理單元,用于創(chuàng)建i/o線程,進行所述當(dāng)前緩存隊列中的日志數(shù)據(jù)向日志文件中的寫入,在寫入期間對所述日志文件添加同步鎖,在寫入完成后解除該同步鎖;

第二線程管理單元,用于創(chuàng)建邏輯線程,進行所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列對待寫入的日志數(shù)據(jù)的獲取。

優(yōu)選的,所述控制模塊,還用于在所述當(dāng)前緩存隊列中的日志數(shù)據(jù)全部寫入完成后,從所述緩存隊列組中重新選擇當(dāng)前緩存隊列。

優(yōu)選的,所述隊列生成模塊,還用于對于多個日志文件寫入任務(wù),為每個日志文件寫入任務(wù)分別分配對應(yīng)的緩存隊列組。

本發(fā)明提供了一種日志記錄方法與裝置,為日志文件寫入任務(wù)分配緩存隊列組,所述緩存隊列組包含至少兩個緩存隊列,選擇所述緩存隊列組中的至少一個緩存隊列作為當(dāng)前緩存隊列,將所述當(dāng)前緩存隊列中的日志數(shù)據(jù)寫入磁盤中的日志文件,同時所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列獲取待寫入的日志數(shù)據(jù),以雙緩存隊列或多緩存隊列的形式進行分工,緩存數(shù)據(jù)與寫入數(shù)據(jù)同步進行,實現(xiàn)了高效并行的日志數(shù)據(jù)緩存寫入,解決了系統(tǒng)處理能力低的問題。

參照附圖來閱讀對于示例性實施例的以下描述,本發(fā)明的其他特性特征和優(yōu)點將變得清晰。

附圖說明

并入到說明書中并且構(gòu)成說明書的一部分的附圖示出了本發(fā)明的實施例,并且與描述一起用于解釋本發(fā)明的原理。在這些附圖中,類似的附圖標(biāo)記用于表示類似的要素。下面描述中的附圖是本發(fā)明的一些實施例,而不是全部實施例。對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,可以根據(jù)這些附圖獲得其他的附圖。

圖1示例性地示出了本發(fā)明的實施例一提供的一種日志記錄方法流程;

圖2示例性地示出了本發(fā)明的實施例二提供的一種日志記錄裝置的結(jié)構(gòu)。

具體實施方式

為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互任意組合。

無論是單線程還是多線程的日志文件寫入方式,均存在系統(tǒng)處理效率低的問題。為了解決該問題,本發(fā)明的實施例提供了一種日志記錄方法和裝置。下面結(jié)合附圖,對本發(fā)明的實施例進行詳細說明。

首先結(jié)合附圖,對本發(fā)明的實施例一進行說明。

本發(fā)明實施例提供了一種日志記錄方法,使用該方法,能夠在保證可靠性的前提下有效提高日志文件寫入效率。使用該方法完成日志記錄的流程如圖1所示,包括:

步驟101、為日志文件寫入任務(wù)分配緩存隊列組,所述緩存隊列組包含至少兩個緩存隊列;

本步驟中,首先為日志文件寫入任務(wù)分配緩存隊列組,緩存隊列組中配置有多個緩存隊列。在一般的應(yīng)用環(huán)境中,多采用一個緩存隊列組包含兩個緩存隊列的配置方式。

對于多個日志文件寫入任務(wù),為每個日志文件寫入任務(wù)分別分配對應(yīng)的緩存隊列組。

以下,以每組包含兩個緩存隊列為例進行說明。本步驟中,創(chuàng)建多組緩存隊列組(緩存隊列組為雙緩存),為每個用戶分配一組緩存隊列。

步驟102、選擇所述緩存隊列組中的至少一個緩存隊列作為當(dāng)前緩存隊列;

本步驟中,從緩存隊列組內(nèi)選擇一個緩存隊列作為當(dāng)前緩存隊列,當(dāng)前緩存隊列即為負責(zé)數(shù)據(jù)寫入日志數(shù)據(jù)到磁盤的緩存隊列,除當(dāng)前緩存隊列外的其他緩存隊列負責(zé)接收待寫入磁盤的日志數(shù)據(jù)。可根據(jù)預(yù)置的篩選規(guī)則,從所述緩存隊列組中存儲有日志數(shù)據(jù)的緩存隊列中選擇至少一個緩存隊列作為當(dāng)前緩存隊列。篩選規(guī)則可根據(jù)應(yīng)用場景確定,如選擇已緩存日志數(shù)據(jù)較多的緩存隊列作為當(dāng)前緩存隊列或?qū)⒖捎镁彺骊犃幸粤斜淼男问匠尸F(xiàn)后,接收用戶指令,根據(jù)用戶指令確定當(dāng)前緩存隊列。

具體的,可以日志緩存列表的形式實現(xiàn)緩存隊列。例如,創(chuàng)建緩存隊列組,包含日志緩存列表buffera和日志緩存列表bufferb,并且指定當(dāng)前正在使用的日志緩存列表。

步驟103、將所述當(dāng)前緩存隊列中的日志數(shù)據(jù)寫入磁盤中的日志文件,同時所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列獲取待寫入的日志數(shù)據(jù);

本步驟中,緩存隊列組中的部分緩存隊列進行日志數(shù)據(jù)向磁盤中日志文件的寫入,另一部分緩存隊列獲取待寫入的日志數(shù)據(jù),向磁盤寫入數(shù)據(jù)與繼續(xù)獲取待寫入的日志數(shù)據(jù)通過不同線程并行進行,大大提高了日志文件寫入效率。

本步驟中,優(yōu)選的,為兩個緩存隊列分別配置線程:

創(chuàng)建i/o線程,進行所述當(dāng)前緩存隊列中的日志數(shù)據(jù)向日志文件中的寫入,在寫入期間對所述日志文件添加同步鎖;

創(chuàng)建邏輯線程,進行所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列對待寫入的日志數(shù)據(jù)的獲取。

仍以一個緩存隊列組中包含兩個緩存隊列為例進行說明,兩個緩存隊列中的一個給邏輯線程用來讀,另一個負責(zé)給i/o線程來寫。

日志數(shù)據(jù)作為一個stringbuffer添加到當(dāng)前正在使用的arraylist<stringbuffer>a中,另一個則空閑。

將當(dāng)前的日志文件進行加鎖同步,根據(jù)條件判斷獲得當(dāng)前需要進行輸出緩存的日志緩存列表,進行日志文件的緩存寫入。

i/o線程每次寫緩存隊列時需要添加同步鎖,但是邏輯線程在讀隊列是不需要加鎖的。

當(dāng)有多個線程來進行日志記錄的時候,將需要寫入的日志數(shù)據(jù)先存放到負責(zé)寫入的緩存隊列當(dāng)中,然后將邏輯讀的線程設(shè)為非阻塞方式。此時邏輯讀的隊列就開始工作了。在當(dāng)邏輯讀的線程讀取他自己的緩存隊列的數(shù)據(jù)之后,將邏輯讀的緩存隊列和負責(zé)寫入的緩存隊列進行交換。

步驟104、在所述當(dāng)前緩存隊列中的日志數(shù)據(jù)全部寫入完成后,從所述緩存隊列組中重新選擇當(dāng)前緩存隊列;

本步驟中,在當(dāng)前緩存隊列中的日志數(shù)據(jù)向磁盤寫入完成后,就從所述緩存隊列組中重新選擇當(dāng)前緩存隊列,將其他已緩存有日志數(shù)據(jù)的緩存隊列選擇為新的當(dāng)前緩存隊列,將新的當(dāng)前緩存隊列中的日志數(shù)據(jù)繼續(xù)向磁盤寫入;而上一個當(dāng)前緩存隊列則繼續(xù)獲取待寫入的日志數(shù)據(jù)。通過這樣的交替,實現(xiàn)不間斷的數(shù)據(jù)寫入。

仍以一個緩存隊列組中包含兩個緩存隊列為例進行說明,當(dāng)邏輯線程讀完隊列后會將自己的緩存隊列與i/o線程的緩存隊列相互調(diào)換。邏輯線程在調(diào)換隊列時也需要添加同步鎖,既在所述當(dāng)前緩存隊列中的日志數(shù)據(jù)全部寫入完成后,重新選擇當(dāng)前緩存隊列完成之前,對待寫入的日志數(shù)據(jù)的獲取添加同步鎖。

當(dāng)內(nèi)存中的日志數(shù)據(jù)輸出到磁盤文件后,會將當(dāng)前使用的arraylist<buffer>a與空閑的arraylist<buffer>b進行角色的互換。具體流程如下:

如果獲取的當(dāng)前正在將日志數(shù)據(jù)寫入緩存的是arraylist<buffer>a,則arraylist<buffer>a轉(zhuǎn)換為寫入磁盤緩存。從而將正在空閑的arraylist<buffer>b轉(zhuǎn)換為繼續(xù)接收日志數(shù)據(jù)寫入的緩存列表。交換后空閑的arraylist<buffer>b將接收日志數(shù)據(jù),而之前已經(jīng)寫入內(nèi)容的arraylist<buffer>a則用來輸出日志文件到磁盤存儲。

日志緩存列表占用的緩存區(qū)的大小可根據(jù)任務(wù)中涉及的數(shù)據(jù)量大小進行調(diào)整,如果緩存區(qū)很小,就更能及時處理數(shù)據(jù),但是吞吐量以及出現(xiàn)資源競爭的幾率就會隨之增大;緩存區(qū)設(shè)置較大則效果相反。

優(yōu)選的,可以給緩存區(qū)設(shè)置容量上限,在緩存區(qū)存儲的數(shù)據(jù)量超過上限之后,再接收到的數(shù)據(jù)將會丟棄而不插入日志緩存列表。

將緩存列表a中的日志文件輸出到磁盤,支持內(nèi)存大小觸發(fā)和刷新時間間隔觸發(fā)寫入磁盤文件。

雙緩存列表的交互可以避免每次日志文件輸出到磁盤時影響新日志數(shù)據(jù)的接收以及多線程鎖的問題。

日志文件輸出到磁盤是支持多種輸出方式,可以根據(jù)時間間隔觸發(fā)寫操作,也可以根據(jù)內(nèi)存緩沖去大小觸發(fā)寫操作。

下面結(jié)合附圖,對本發(fā)明的實施例二進行說明。

本發(fā)明實施例提供了一種日志記錄裝置,能夠與本發(fā)明的實施例一提供的一種日志記錄方法相結(jié)合,進行高效的日志文件寫入,該裝置的結(jié)構(gòu)如圖2所示,包括:

隊列生成模塊201,用于為日志文件寫入任務(wù)分配緩存隊列組,所述緩存隊列組包含至少兩個緩存隊列;

控制模塊202,用于選擇所述緩存隊列組中的至少一個緩存隊列作為當(dāng)前緩存隊列;

讀寫管理模塊203,用于將所述當(dāng)前緩存隊列中的日志數(shù)據(jù)寫入磁盤中的日志文件,同時所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列獲取待寫入的日志數(shù)據(jù)。

優(yōu)選的,所述讀寫管理模塊203包括:

第一線程管理單元2031,用于創(chuàng)建i/o線程,進行所述當(dāng)前緩存隊列中的日志數(shù)據(jù)向日志文件中的寫入,在寫入期間對所述日志文件添加同步鎖;

第二線程管理單元2032,用于創(chuàng)建邏輯線程,進行所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列對待寫入的日志數(shù)據(jù)的獲取。

優(yōu)選的,所述控制模塊202,還用于在所述當(dāng)前緩存隊列中的日志數(shù)據(jù)全部寫入完成后,從所述緩存隊列組中重新選擇當(dāng)前緩存隊列。

優(yōu)選的,所述隊列生成模塊201,還用于對于多個日志文件寫入任務(wù),為每個日志文件寫入任務(wù)分別分配對應(yīng)的緩存隊列組。

本發(fā)明的實施例提供了一種日志記錄方法與裝置,為日志文件寫入任務(wù)分配緩存隊列組,所述緩存隊列組包含至少兩個緩存隊列,選擇所述緩存隊列組中的至少一個緩存隊列作為當(dāng)前緩存隊列,將所述當(dāng)前緩存隊列中的日志數(shù)據(jù)寫入磁盤中的日志文件,同時所述緩存隊列組中除所述當(dāng)前緩存隊列外的緩存隊列獲取待寫入的日志數(shù)據(jù),以雙緩存隊列或多緩存隊列的形式進行分工,緩存數(shù)據(jù)與寫入數(shù)據(jù)同步進行,實現(xiàn)了高效并行的日志數(shù)據(jù)緩存寫入,解決了系統(tǒng)處理能力低的問題。

上面描述的內(nèi)容可以單獨地或者以各種方式組合起來實施,而這些變型方式都在本發(fā)明的保護范圍之內(nèi)。

最后應(yīng)說明的是:以上實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制。盡管參照前述實施例對本發(fā)明進行了詳細的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對前述各實施例所記載的技術(shù)方案進行修改,或者對其中部分技術(shù)特征進行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的精神和范圍。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
遵化市| 海伦市| 昌平区| 桑日县| 江津市| 黄大仙区| 灵川县| 正蓝旗| 宁化县| 汪清县| 马关县| 肥东县| 霍邱县| 黄山市| 化隆| 唐海县| 漳州市| 宜州市| 连城县| 中牟县| 鹰潭市| 泗阳县| 通山县| 新宁县| 栾川县| 临颍县| 盖州市| 威远县| 全椒县| 婺源县| 靖西县| 南投市| 蚌埠市| 长垣县| 施秉县| 扶风县| 黄浦区| 玉林市| 慈利县| 怀仁县| 赣州市|