專利名稱::一種日志保存方法及裝置的制作方法
技術領域:
:本發(fā)明涉及日志保存技術,尤其涉及一種日志保存方法及裝置。
背景技術:
:日志保存是一種用于記錄用戶在網(wǎng)絡中的行為的技術,采用日志保存技術后可以方便的對用戶在網(wǎng)絡中的行為進行查詢、跟蹤和分析。日志保存技術在即時通信系統(tǒng)、銀行系統(tǒng)、電話系統(tǒng)以及網(wǎng)站系統(tǒng)等網(wǎng)絡系統(tǒng)中都得到了廣泛的應用,例如,在電話系統(tǒng)中,日志系統(tǒng)會記錄每次通話的雙方號碼、起始時間、產(chǎn)生的話費等內容;在銀行系統(tǒng)中,日志系統(tǒng)會記錄用戶的存取款記錄;在網(wǎng)站系統(tǒng)中,日志系統(tǒng)會記錄網(wǎng)站的訪問記錄;在即時通信系統(tǒng)中,日志系統(tǒng)會記錄即使通信軟件的登錄記錄等。圖1所示為日志系統(tǒng)的結構示意圖,由圖中可見,日志系統(tǒng)主要包括日志產(chǎn)生裝置和日志保存裝置,其中日志產(chǎn)生裝置用于產(chǎn)生日志,可以是處理業(yè)務的終端(如ATM機),也可以是處理業(yè)務的后臺服務器(如電話交換機、計費服務器等);日志保存裝置用于接收日志產(chǎn)生裝置產(chǎn)生的日志并對其進行保存,日志可以保存在文件中,也可以保存在數(shù)據(jù)庫中,其中后者因為其易管理性而成為主流?,F(xiàn)有技術的日志系統(tǒng)中,日志保存裝置可以設置在日志產(chǎn)生裝置中,也可以獨立于日志產(chǎn)生裝置作為一個單獨的功能實體,下面分別予以說明將日志保存裝置設置在日志產(chǎn)生裝置中即是將日志產(chǎn)生裝置產(chǎn)生的日志直接保存在本地磁盤中,例如,常見的門戶網(wǎng)站系統(tǒng)由一個或多個網(wǎng)站服務器組成,這些網(wǎng)站服務器就是日志產(chǎn)生裝置。當有一個用戶訪問網(wǎng)站時,網(wǎng)站服務器把用戶的訪問日志記錄(如時間、IP等)直接保存在本地磁盤,以后再定時匯總這些日志信息。這種將日志保存裝置設置在日志產(chǎn)生裝置中的日志保存方式的實現(xiàn)簡單,不用在日志產(chǎn)生裝置和日志保存裝置之間設計專門的日志發(fā)送/接收網(wǎng)絡協(xié)議,但是其缺點也很明顯,由于日志產(chǎn)生裝置的主要使命是響應和處理用戶的業(yè)務請求,頻繁的日志保存操作(通常是很慢的磁盤操作)會大大影響日志產(chǎn)生裝置的業(yè)務處理能力。因此,這種將日志保存裝置設置在日志產(chǎn)生裝置中的日志保存方式只適合日志量較小,或者只需抽樣記錄部分日志的應用環(huán)境。圖2所示為獨立設置日志保存裝置的日志系統(tǒng)的結構示意圖,由圖中可見,日志產(chǎn)生裝置和日志保存裝置為各自獨立的功能實體,日志產(chǎn)生裝置和日志保存裝置之間通過特定的網(wǎng)絡端口連接,一個日志保存裝置與多個日志產(chǎn)生裝置相對應,可保存多個日志產(chǎn)生裝置產(chǎn)生的日志。日志產(chǎn)生裝置和日志保存裝置之間需要預先設定日志發(fā)送/接收網(wǎng)絡協(xié)議,日志產(chǎn)生裝置負責把日志發(fā)送到日志保存裝置特定的網(wǎng)絡端口,日志保存裝置負責監(jiān)聽特定的網(wǎng)絡端口,一旦有日志到達,就把日志接收下來并將其保存到磁盤。日志保存裝置中的日志接收模塊將日志保存到磁盤的方式主用有三種,第一種方式是將日志直接插入到數(shù)據(jù)庫,由于多了一層數(shù)據(jù)庫操作,所以保存速度比較緩慢;第二種方式是將日志直接保存到文件,這種方式的保存速度比第一種方式要快,但是文件形式的日志不方便匯總和查詢;第三種方式是先將日志保存到文件,再讀取文件內容,把日志一次一行地或一次多行地插入到數(shù)據(jù)庫中,一次多行的操作方法能夠大大提高數(shù)據(jù)庫插入速度。無論采取上述三種保存方式中的哪一種,都面臨一個重要的問題,由于磁盤I/O(Input/Output,輸入/輸出)的速度趕不上網(wǎng)絡I/O的速度,因此在日志量很大的情況下,會導致日志來不及寫入磁盤而丟失?,F(xiàn)有技術中通常采用日志保存裝置集群的方式來解決磁盤I/O趕不上網(wǎng)絡I/O而丟失日志的問題,圖3所示為采用集群式日志保存裝置的日志系統(tǒng)的結構示意圖,由圖中可見,多個日志保存裝置組成一個集群,集群中的每個日志保存裝置與一組日志產(chǎn)生裝置相對應,不同組的日志產(chǎn)生裝置把日志發(fā)到對應的日志保存裝置,從而減輕了單個日志保存裝置的負擔。這種方式的優(yōu)點是可以平行擴展,只要增加足夠數(shù)量的日志保存裝置,就可以解決日志丟失的問題。但在增加日志保存裝置的同時日志系統(tǒng)的成本也會大大提高,并且由于日志分散保存在不同的日志保存裝置中,不方便進行日志的匯總和查詢。
發(fā)明內容本發(fā)明提供一種日志保存方法及裝置,用以解決現(xiàn)有技術在進行日志保存過程中日志容易丟失、日志入庫耗時過長的問題。本發(fā)明方法包括一種日志保存方法,所述日志由日志產(chǎn)生裝置產(chǎn)生,包括步驟接收并緩存日志產(chǎn)生裝置產(chǎn)生的日志;讀取緩存中的日志,將其保存在二進制形式的日志文件中;將所述二進制形式的日志文件轉換為文本形式的日志文件,將該文本形式的日志文件導入數(shù)據(jù)庫中進行保存。每間隔預定時間讀取一次緩存,將緩存中保存的日志全部讀出。當緩存中保存的日志所占用的存儲空間達到預定數(shù)值時讀取一次緩存,將緩存中保存的日志全部讀出。每個二進制形式的日志文件中保存了設定時長內從緩存中讀出的全部日志。每個二進制形式的日志文件中保存了設定數(shù)量的從緩存中讀出的日志。調用數(shù)據(jù)庫底層接口將文本形式的日志文件批量導入數(shù)據(jù)庫中。一種日志保存裝置,用于保存日志產(chǎn)生裝置產(chǎn)生的日志,包括日志接收模塊,用于接收日志產(chǎn)生裝置產(chǎn)生的日志,將其保存在緩存中;日志導出模塊,用于讀取緩存中的日志,將其保存在二進制形式的日志文件中;數(shù)據(jù)轉換模塊,用于將二進制形式的日志文件轉換為文本形式的日志文件;數(shù)據(jù)庫導入模塊,用于將文本形式的日志文件導入數(shù)據(jù)庫中進行保存。所述緩存設置在日志接收模塊中,或者為所述裝置中的單獨設置的模塊。所述日志接收模塊實時接收日志產(chǎn)生裝置產(chǎn)生的日志。所述日志導出模塊每間隔預定時間讀取一次緩存,將緩存中保存的日志全部讀出。所述日志導出模塊在緩存中保存的日志占用的存儲空間達到預定數(shù)值時讀取一次緩存,將緩存中保存的日志全部讀出。所述數(shù)據(jù)庫導入模塊調用數(shù)據(jù)庫底層接口將文本形式的日志文件批量導入數(shù)據(jù)庫中。本發(fā)明有益效果如下本發(fā)明采用緩存技術對接收到的日志產(chǎn)生裝置產(chǎn)生的日志進行緩存,采用批量寫的方式一次性地把從緩存中讀出的日志全部寫到磁盤上的二進制形式的日志文件中,將二進制形式的日志文件轉換為文本形式的日志文件后,利用數(shù)據(jù)庫的批量導入工具將該文本形式的日志文件批量導入數(shù)據(jù)庫中進行保存。由于緩存的存取速度遠遠大于網(wǎng)絡速度,因此可以保證不會丟失日志產(chǎn)生裝置產(chǎn)生的日志,采用批量寫的方式一次性地把從緩存中讀出的日志全部寫到磁盤上的二進制形式的日志文件中,可以保證磁盤寫入的最大速度,避免了由于磁盤速度導致的日志丟失問題;利用數(shù)據(jù)庫的批量導入工具將文本形式的日志文件批量導入數(shù)據(jù)庫中進行保存可以縮短日志入庫的時間,本發(fā)明完全解決了日志入庫時間過長的問題,且硬件資源消耗很少。圖1為日志系統(tǒng)的結構示意圖;圖2為獨立設置日志保存裝置的日志系統(tǒng)的結構示意圖;圖3為采用集群式日志保存裝置的日志系統(tǒng)的結構示意圖;圖4為本發(fā)明的日志保存裝置的結構示意圖;圖5為本發(fā)明的日志保存的流程圖。具體實施例方式本發(fā)明針對現(xiàn)有技術的缺陷,提出一種適用于日志量很大的情況下的日志保存方法及裝置,下面將結合各個附圖對本發(fā)明的主要實現(xiàn)原理及其具體實施方式進行詳細的闡述。圖4所示為本發(fā)明的日志保存裝置的結構示意圖,由圖中可見,本發(fā)明的日志保存裝置的結構主要包括日志接收模塊,接收日志產(chǎn)生裝置產(chǎn)生的日志,將其保存在緩存中;日志導出模塊,讀取緩存中的日志,將其保存在磁盤上的二進制形式的日志文件中;數(shù)據(jù)轉換模塊,將磁盤上的二進制形式的日志文件轉換并保存為文本形式的日志文件;數(shù)據(jù)庫導入模塊,將文本形式的日志文件導入磁盤的數(shù)據(jù)庫中進行保存。上述緩存即可以設置在日志接收模塊中,也可以單獨設置,作為日志保存裝置中的獨立模塊。圖5所示為本發(fā)明的日志保存的流程圖,參見圖5并結合圖4,本發(fā)明的日志保存的主要實現(xiàn)過程如下步驟S10、日志接收模塊實時監(jiān)聽日志產(chǎn)生裝置和日志保存裝置之間的特定網(wǎng)絡端口,接收日志產(chǎn)生裝置發(fā)送過來的日志。步驟S11、日志接收模塊將接收到的日志保存到一塊緩存區(qū)里,由于內存的存取速度遠遠大于網(wǎng)絡速度,因此可以保證不會丟失日志;緩存區(qū)用“共享內存”技術實現(xiàn),緩存區(qū)在數(shù)據(jù)結構上是一個環(huán),假設緩存區(qū)的大小是K字節(jié),緩存區(qū)當前的頭部是第H字節(jié),尾部是第T字節(jié),日志接收模塊總是把接收到的日志寫到緩存區(qū)的尾部,即從第(T+1)%K個字節(jié)開始寫,其中,%表示對括號里面的數(shù)值進行取余操作。也就是說,如果T+1=K,那么從緩存區(qū)的第0個字節(jié)開始寫,這樣就實現(xiàn)了環(huán)狀緩存區(qū);一般來講,日志的格式都是比較固定的,在設計時通常設計成定長的二進制數(shù)據(jù)(每一條日志占用相同大小的存儲空間),因此,緩存區(qū)的內容是二進制數(shù)據(jù),這主要是由于二進制數(shù)據(jù)比表示相同內容的文本數(shù)據(jù)節(jié)省存儲空間,可以減少對緩存區(qū)大小的要求。比如,電話號碼88888888,如果用文本數(shù)據(jù)表示,需要8個字節(jié),而用二進制數(shù)據(jù)表示時,其數(shù)據(jù)形式為00000101010011000101011000111000,只需要4個字節(jié)。步驟S12、日志導出模塊從緩存區(qū)的頭部開始讀取日志,將其寫入磁盤內的二進制形式的日志文件中;日志導出模塊每間隔預定時間或者在緩存中保存的日志占用的存儲空間達到預定數(shù)值時讀取一次緩存區(qū),將緩存區(qū)中保存的日志全部讀出,日志導出模塊采用了批量寫的方式一次性地把從緩存區(qū)中讀出的日志全部寫到磁盤上的二進制形式的日志文件中,批量寫技術可以保證磁盤寫入的最大速度,避免了由于磁盤速度導致的日志丟失問題。二進制形式的日志文件的保存方式主要有兩種,一種方式是每個二進制形式的日志文件中保存設定時長(如24小時)內從緩存中讀出的全部日志,即設定時長內從緩存中讀出的全部日志形成一個二進制形式的日志文件;另一種方式是每個二進制形式的日志文件中保存設定數(shù)量(如1000萬條)的從緩存中讀出的日志,即每當從緩存中讀出的日志達到設定數(shù)量即形成一個二進制形式的日志文件。假設緩存區(qū)的大小是K字節(jié),當前的頭部是第H字節(jié),尾部是第T字節(jié),那么需要導出的內容是1)如果H<=T,需要導出的內容是[H,T];2)如果H>T,那么需要導出的內容是[H,K-1]和。日志導出模塊用標準C函數(shù)庫的fwrite()函數(shù)可以方便地實現(xiàn)批量寫,例如,fwrite(pszBuffer,iLogLen,iLogCount,pfOutputFile),表示把緩存區(qū)pszBuffe的內容寫到文件pfOutputFile中,寫iLogCount條日志,每條日志iLogLen個字節(jié)。步驟S13、數(shù)據(jù)轉換模塊將磁盤上的二進制形式的日志文件轉換并保存為文本形式的日志文件;日志保存在二進制文件中,不方便做各種查詢、追蹤和分析,我們需要把它們放到數(shù)據(jù)庫中,以方便查詢,大部分數(shù)據(jù)庫產(chǎn)品(如Oracle、DB2、SQLServer、MySQL等)都提供了批量導入的工具,但這些數(shù)據(jù)庫產(chǎn)品只能批量導入文本文件,因此,需要數(shù)據(jù)轉換模塊將二進制形式的日志文件轉換并保存為符合數(shù)據(jù)庫導入格式要求的文本形式的日志文件。例如,對于論壇登錄日志用戶ID(整數(shù))、登錄時間(整數(shù))、登錄IP(整數(shù))其二進制形式的日志內容為000001010100110001010110001110000100001100001100100011100110101111001010100001000010001000100111其轉換后的文本形式的日志內容為88888888,2005-08-24231243,202.132.34.39步驟S14、數(shù)據(jù)庫導入模塊將文本形式的日志文件導入磁盤的數(shù)據(jù)庫中進行保存;本發(fā)明主要用于日志量很大的應用環(huán)境中,如每天10億條,如果用數(shù)據(jù)庫的Insert語句插入大量的日志數(shù)據(jù),入庫時間會非常長,約需要10個小時左右。即時使用“一次插入多行”的插入方式,也需要5個小時左右。插入慢的原因是數(shù)據(jù)庫需要頻繁對待插入的表進行加鎖/解鎖操作,需要頻繁地做表文件空間的查找/分配操作。大部分數(shù)據(jù)庫產(chǎn)品(如Oracle,DB2,SQLServer,MySQL)都提供了批量導入的工具,如MySQL的LoadDataInfile語句,SQLServer的BulkInsert語句等;例如,MySQL的批量導入的語句為LoadDatainfile‘/tmp/source.txt’intotableTargetTableNamefieldsterminatedby‘,’;SQLServer的批量導入的語句為BulkinsertTargetTableNamefrom″/tmp/source.txt″with(FIELDTERMINATOR=′,′);在本發(fā)明中,數(shù)據(jù)庫導入模塊調用數(shù)據(jù)庫提供的接口或者SQL語句,如上述LoadDataInfile語句或者BulkInsert...From語句,使用批量導入方式將文本形式的日志文件導入數(shù)據(jù)庫中,由于這種方式直接調用數(shù)據(jù)庫底層接口對數(shù)據(jù)庫進行寫操作,因此這種方式的導入速度比Insert語句快10~1000倍,使10億條日志僅用約30分鐘就可以全部入庫。本發(fā)明采用緩存技術、批量寫技術以及批量導入數(shù)據(jù)庫技術進行日志的保存,解決了日志入庫時間過長的問題,完全避免了因為磁盤速度小于網(wǎng)絡速度造成的日志丟失,且硬件資源消耗很少。顯然,本領域的技術人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權利要求及其等同技術的范圍之內,則本發(fā)明也意圖包含這些改動和變型在內。權利要求1.一種日志保存方法,所述日志由日志產(chǎn)生裝置產(chǎn)生,其特征在于,包括步驟接收并緩存日志產(chǎn)生裝置產(chǎn)生的日志;讀取緩存中的日志,將其保存在二進制形式的日志文件中;將所述二進制形式的日志文件轉換為文本形式的日志文件,將該文本形式的日志文件導入數(shù)據(jù)庫中進行保存。2.根據(jù)權利要求1所述的日志保存方法,其特征在于,每間隔預定時間讀取一次緩存,將緩存中保存的日志全部讀出。3.根據(jù)權利要求1所述的日志保存方法,其特征在于,當緩存中保存的日志所占用的存儲空間達到預定數(shù)值時讀取一次緩存,將緩存中保存的日志全部讀出。4.根據(jù)權利要求1、2或3所述的日志保存方法,其特征在于,每個二進制形式的日志文件中保存了設定時長內從緩存中讀出的全部日志。5.根據(jù)權利要求1、2或3所述的日志保存方法,其特征在于,每個二進制形式的日志文件中保存了設定數(shù)量的從緩存中讀出的日志。6.根據(jù)權利要求1所述的日志保存方法,其特征在于,調用數(shù)據(jù)庫底層接口將文本形式的日志文件批量導入數(shù)據(jù)庫中。7.一種日志保存裝置,用于保存日志產(chǎn)生裝置產(chǎn)生的日志,其特征在于,包括日志接收模塊,用于接收日志產(chǎn)生裝置產(chǎn)生的日志,將其保存在緩存中;日志導出模塊,用于讀取緩存中的日志,將其保存在二進制形式的日志文件中;數(shù)據(jù)轉換模塊,用于將二進制形式的日志文件轉換為文本形式的日志文件;數(shù)據(jù)庫導入模塊,用于將文本形式的日志文件導入數(shù)據(jù)庫中進行保存。8.根據(jù)權利要求7所述的日志保存裝置,其特征在于,所述緩存設置在日志接收模塊中,或者為所述裝置中的單獨設置的模塊。9.根據(jù)權利要求7所述的日志保存裝置,其特征在于,所述日志接收模塊實時接收日志產(chǎn)生裝置產(chǎn)生的日志。10.根據(jù)權利要求7所述的日志保存裝置,其特征在于,所述日志導出模塊每間隔預定時間讀取一次緩存,將緩存中保存的日志全部讀出。11.根據(jù)權利要求7所述的日志保存裝置,其特征在于,所述日志導出模塊在緩存中保存的日志占用的存儲空間達到預定數(shù)值時讀取一次緩存,將緩存中保存的日志全部讀出。12.根據(jù)權利要求7所述的日志保存裝置,其特征在于,所述數(shù)據(jù)庫導入模塊調用數(shù)據(jù)庫底層接口將文本形式的日志文件批量導入數(shù)據(jù)庫中。全文摘要本發(fā)明公開了一種日志保存方法及裝置,用以解決現(xiàn)有技術在進行日志保存過程中日志容易丟失、日志入庫耗時過長的問題。所述方法包括步驟A.接收并緩存日志產(chǎn)生裝置產(chǎn)生的日志;B.讀取緩存中的日志,將其保存在二進制形式的日志文件中;C.將所述二進制形式的日志文件轉換為文本形式的日志文件,將該文本形式的日志文件導入數(shù)據(jù)庫中進行保存;所述裝置包括日志接收模塊、日志導出模塊、數(shù)據(jù)轉換模塊、數(shù)據(jù)庫導入模塊;本發(fā)明完全解決了日志入庫時間過長的問題,且硬件資源消耗很少。文檔編號H04L12/24GK1932812SQ20051010332公開日2007年3月21日申請日期2005年9月16日優(yōu)先權日2005年9月16日發(fā)明者羅道鋒,張彥玲申請人:騰訊科技(深圳)有限公司