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