本申請涉及數(shù)據(jù)處理領域,具體而言,涉及一種日志文件的保存方法和裝置。
背景技術:
::Javaweb應用中有一個非常出名的應用服務器-tomcat,javaweb應用可以跑在tomcat里對外提供服務,每個用戶訪問該tomcat的日志是非常有價值的,有必要將這些日志記錄并保存起來。Tomcat已經(jīng)提供了兩種方式保存這些訪問日志,一種是基于文件的log方式AccessLogValve,另外一種是tomcat7.0版本提供的JDBCAccessLogValve。如果使用基于文件的log方式AccessLogValve保存日志,需要將原始日志文件進行轉(zhuǎn)化,而且這些日志文件都是寫在本地的,會受到磁盤容量大小的限制。為了避免受到磁盤容量大小的限制這個問題,可以使用基于JDBC方式的JDBCAccessLogValve保存日志,但是該方式具有以下缺點:(1)JDBCAccessLogValve中的JDBC的連接不是從連接池拿的,建立連接時消耗資源,(2)JDBCAccessLogValve沒有采用批量插入,(3)JDBCAccessLogValve采用了同步插入,(4)在數(shù)據(jù)量大的時候,對數(shù)據(jù)庫做分庫分表比較麻煩,導致無法快速高效地保存服務器的日志文件。針對上述的問題,目前尚未提出有效的解決方案。技術實現(xiàn)要素:本申請實施例提供了一種日志文件的保存方法和裝置,以至少解決無法快速高效地保存服務器的日志文件的技術問題。根據(jù)本申請實施例的一個方面,提供了一種日志文件的保存方法,包括:獲取服務器記錄的日志文件;在分布式數(shù)據(jù)庫中創(chuàng)建目標文件,其中,所述目標文件用于存儲所述日志文件;獲取所述服務器與所述分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源;以及利用所述數(shù)據(jù)傳輸資源,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中。進一步地,在利用所述數(shù)據(jù)傳輸資源,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中之前,所述方法還包括:將所述日志文件存儲至所述服務器的緩沖 區(qū);判斷所述緩沖區(qū)的緩沖量是否達到預設值;利用所述數(shù)據(jù)傳輸資源,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中包括:在判斷出所述緩沖區(qū)的緩沖量達到所述預設值的情況下,通過所述數(shù)據(jù)傳輸資源,將存儲在所述緩沖區(qū)中的所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中。進一步地,在獲取所述服務器與所述分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源之前,所述方法還包括:建立所述服務器與所述分布式數(shù)據(jù)庫之間的連接池,其中,所述連接池中包含多個連接,所述數(shù)據(jù)傳輸資源為所述連接;在判斷出所述緩沖區(qū)的緩沖量達到所述預設值的情況下,通過所述數(shù)據(jù)傳輸資源,將存儲在所述緩沖區(qū)中的所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中包括:在判斷出所述緩沖區(qū)的緩沖量達到所述預設值的情況下,從所述連接池中獲取多個目標連接,其中,所述目標連接是所述連接池中的空閑連接;利用所述多個目標連接,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中。進一步地,所述服務器為多個,獲取服務器記錄的日志文件包括:獲取服務器Sj記錄的日志文件,其中,j依次取1至n,n為所述服務器的數(shù)量,在分布式數(shù)據(jù)庫中創(chuàng)建目標文件包括:在所述分布式數(shù)據(jù)庫中創(chuàng)建子目標文件D1至子目標文件Dn,其中,所述子目標文件D1至所述子目標文件Dn構成所述目標文件,建立所述服務器與所述分布式數(shù)據(jù)庫之間的連接池包括:建立所述服務器Sj與所述分布式數(shù)據(jù)庫之間的連接池Pj,利用所述多個目標連接,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中包括:利用從所述連接池Pj中獲取到的所述目標連接,將所述服務器Sj記錄的日志文件保存至所述分布式數(shù)據(jù)庫的子目標文件Dj中。進一步地,利用所述數(shù)據(jù)傳輸資源,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中還包括:利用所述數(shù)據(jù)傳輸資源,以異步傳輸方式將所述日志文件中的多條數(shù)據(jù)批量保存至所述分布式數(shù)據(jù)庫的所述目標文件中。根據(jù)本申請實施例的另一方面,還提供了一種日志文件的保存裝置,包括:第一獲取單元,用于獲取服務器記錄的日志文件;創(chuàng)建單元,用于在分布式數(shù)據(jù)庫中創(chuàng)建目標文件,其中,所述目標文件用于存儲所述日志文件;第二獲取單元,用于獲取所述服務器與所述分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源;以及保存單元,用于利用所述數(shù)據(jù)傳輸資源,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中。進一步地,所述裝置還包括:存儲單元,用于在所述保存單元利用所述數(shù)據(jù)傳輸資源,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中之前,將所述日志文件存儲至所述服務器的緩沖區(qū);判斷單元,用于判斷所述緩沖區(qū)的緩沖量是否達到預設值;所述保存單元包括:第一保存子單元,用于當所述判斷單元判斷出所述緩沖 區(qū)的緩沖量達到所述預設值時,通過所述數(shù)據(jù)傳輸資源,將存儲在所述緩沖區(qū)中的所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中。進一步地,所述裝置還包括:建立單元,用于在所述第二獲取單元獲取所述服務器與所述分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源之前,建立所述服務器與所述分布式數(shù)據(jù)庫之間的連接池,其中,所述連接池中包含多個連接,所述數(shù)據(jù)傳輸資源為所述連接;所述第一保存子單元包括:獲取模塊,用于當所述判斷單元判斷出所述緩沖區(qū)的緩沖量達到所述預設值時,從所述連接池中獲取多個目標連接,其中,所述目標連接是所述連接池中的空閑連接;保存模塊,用于利用所述獲取模塊獲取的所述多個目標連接,將所述日志文件保存至所述分布式數(shù)據(jù)庫的所述目標文件中。進一步地,所述服務器為多個,所述第一獲取單元包括:第一獲取子單元,用于獲取服務器Sj記錄的日志文件,其中,j依次取1至n,n為所述服務器的數(shù)量,所述創(chuàng)建單元包括:創(chuàng)建子單元,用于在所述分布式數(shù)據(jù)庫中創(chuàng)建子目標文件D1至子目標文件Dn,其中,所述子目標文件D1至所述子目標文件Dn構成所述目標文件,所述建立單元包括:建立子單元,用于建立所述服務器Sj與所述分布式數(shù)據(jù)庫之間的連接池Pj,所述保存模塊包括:保存子模塊,用于利用所述獲取模塊從所述連接池Pj中獲取到的所述目標連接,將所述服務器Sj記錄的日志文件保存至所述分布式數(shù)據(jù)庫的子目標文件Dj中。進一步地,所述保存單元還包括:第二保存子單元,用于利用所述數(shù)據(jù)傳輸資源,以異步傳輸方式將所述日志文件中的多條數(shù)據(jù)批量保存至所述分布式數(shù)據(jù)庫的所述目標文件中。在本申請實施例中,采用獲取服務器記錄的日志文件,在分布式數(shù)據(jù)庫中創(chuàng)建目標文件,其中,目標文件用于存儲日志文件,獲取服務器與分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源,以及利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。通過獲取服務器記錄的日志文件,在分布式數(shù)據(jù)庫中創(chuàng)建用于存儲日志文件的目標文件,獲取服務器和分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源,利用該數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中,由于該方法避免了對數(shù)據(jù)庫做分庫分表,因此能夠?qū)⒎掌饔涗浀娜罩疚募焖俑咝У乇4嬷练植际綌?shù)據(jù)庫中,實現(xiàn)了將服務器記錄的日志文件快速高效地保存至分布式數(shù)據(jù)庫中的技術效果,進而解決了現(xiàn)有技術中無法快速高效地保存服務器的日志文件的技術問題。附圖說明此處所說明的附圖用來提供對本申請的進一步理解,構成本申請的一部分,本申 請的示意性實施例及其說明用于解釋本申請,并不構成對本申請的不當限定。在附圖中:圖1是根據(jù)本申請實施例的日志文件的保存方法的流程圖;以及圖2是根據(jù)本申請實施例的日志文件的保存裝置的示意圖。具體實施方式為了使本
技術領域:
:的人員更好地理解本申請方案,下面將結(jié)合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分的實施例,而不是全部的實施例?;诒旧暾堉械膶嵤├绢I域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應當屬于本申請保護的范圍。需要說明的是,本申請的說明書和權利要求書及上述附圖中的術語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應該理解這樣使用的數(shù)據(jù)在適當情況下可以互換,以便這里描述的本申請的實施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤4送?,術語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設備固有的其它步驟或單元。首先對本申請實施例所涉及的技術術語作如下解釋:Tomcat:Tomcat是一個免費的開源的Web應用服務器,屬于輕量級服務器,普遍應用于中小型系統(tǒng)中。HBase:HBase是一個可靠性高、性能好,面向列、可伸縮的分布式存儲系統(tǒng)。根據(jù)本申請實施例,提供了一種日志文件的保存方法的實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。圖1是根據(jù)本申請實施例的日志文件的保存方法的流程圖,如圖1所示,該方法包括如下步驟:步驟S102,獲取服務器記錄的日志文件。服務器記錄的日志文件可以為用戶的訪問日志,也可以為服務器的運行日志。步驟S104,在分布式數(shù)據(jù)庫中創(chuàng)建目標文件,其中,目標文件用于存儲日志文件。分布式數(shù)據(jù)庫可以為HBase、Cassandra、HyperTable等。在需要存儲的文件的數(shù)據(jù)量非常大的情況下,對數(shù)據(jù)庫做分庫分表十分麻煩,使用HBase等分布式數(shù)據(jù)庫,避免了對數(shù)據(jù)庫做分庫分表,從而提高了保存數(shù)據(jù)的效率。目標文件可以為表。步驟S106,獲取服務器與分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源。步驟S108,利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。HBase是一個分布式的、面向列的數(shù)據(jù)庫,它和一般關系型數(shù)據(jù)庫的最大區(qū)別是:HBase很適合于存儲非結(jié)構化的數(shù)據(jù),還有它是基于列而不是基于行的模式。Rowkey是一段二進制碼流,最大長度為64KB,內(nèi)容可以由使用的用戶自定義。數(shù)據(jù)加載時,一般也是根據(jù)Rowkey(行鍵)的二進制序由小到大進行的。HBase是根據(jù)Rowkey來進行檢索的,系統(tǒng)通過找到某個Rowkey(或者某個Rowkey范圍)所在的Region(區(qū)域),然后將查詢數(shù)據(jù)的請求路由到該Region獲取數(shù)據(jù)。HBase的檢索支持3種方式:(1)通過單個Rowkey訪問,即按照某個Rowkey鍵值進行get操作,這樣獲取唯一一條記錄;(2)通過Rowkey的范圍進行掃描,即通過設置startRowKey(開始行鍵)和endRowKey(結(jié)束行鍵),在這個范圍內(nèi)進行掃描,這樣可以按指定的條件獲取一批記錄;(3)全表掃描,即直接掃描整張表中所有行記錄。HBase按單個Rowkey檢索的效率是很高的,耗時在1毫秒以下,每秒鐘可獲取1000-2000條記錄。通過巧妙地設計Rowkey,使獲取的文件中的數(shù)據(jù)挨在一起(應該在同一個Region下),可以在遍歷結(jié)果時獲得很好的性能。通過獲取服務器記錄的日志文件,在分布式數(shù)據(jù)庫中創(chuàng)建用于存儲日志文件的目標文件,獲取服務器和分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源,利用該數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中,由于該方法避免了對數(shù)據(jù)庫做分庫分表,因此能夠?qū)⒎掌饔涗浀娜罩疚募焖俑咝У乇4嬷练植际綌?shù)據(jù)庫中,實現(xiàn)了將服務器記錄的日志文件快速高效地保存至分布式數(shù)據(jù)庫中的技術效果,進而解決了現(xiàn)有技術中無法快速高效地保存服務器的日志文件的技術問題??蛇x地,在利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中之前,本申請實施例所提供的日志文件的保存方法還包括:將日志文件存儲至服務器的緩沖區(qū);判斷緩沖區(qū)的緩沖量是否達到預設值;利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中包括:在判斷出緩沖區(qū)的緩沖量達到預設值的情況下,通過數(shù)據(jù)傳輸資源,將存儲在緩沖區(qū)中的日志文件保存至分布式數(shù)據(jù)庫的目標文件中。在利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中之前,先將日志文件存儲至服務器的緩沖區(qū),并在緩沖區(qū)的緩沖量達到預設值之后,利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。預設值可預先設置,在緩沖區(qū)的最大緩沖量為M單位時,可以設置預設值為0.5M、0.6M、0.7M或0.8M等。預設值同時也是閾值,即當緩沖區(qū)的緩沖量達到該閾值后,將緩沖區(qū)中的日志文件存儲至分布式數(shù)據(jù)庫。例如,設置預設值為最大緩沖量的60%,將日志文件存儲至緩沖區(qū),在緩沖區(qū)的緩沖量達到最大緩沖量的60%之后,利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。由于CPU的速度快,而I/O(輸入/輸出端口,英文全稱為input/output)設備速度慢,因此容易由于通道不足而產(chǎn)生“瓶頸”現(xiàn)象。通過使用緩沖區(qū),可以改善CPU和I/O設備之間速度不匹配的問題,減少I/O設備對CPU的中斷次數(shù),從而提升了CPU的工作效率,因此提升了服務器的性能,使用戶訪問服務器更加高效,提升了用戶體驗。為緩沖區(qū)的緩沖量設置閾值,可以在緩沖量達到閾值時及時將緩沖區(qū)中存儲的日志文件傳輸至分布式數(shù)據(jù)庫,避免緩沖區(qū)的緩沖量達到最大值后日志文件中的數(shù)據(jù)不能被保存下來而丟失??蛇x地,在獲取服務器與分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源之前,本申請實施例所提供的日志文件的保存方法還包括:建立服務器與分布式數(shù)據(jù)庫之間的連接池,其中,連接池中包含多個連接,數(shù)據(jù)傳輸資源為連接;在判斷出緩沖區(qū)的緩沖量達到預設值的情況下,通過數(shù)據(jù)傳輸資源,將存儲在緩沖區(qū)中的日志文件保存至分布式數(shù)據(jù)庫的目標文件中包括:在判斷出緩沖區(qū)的緩沖量達到預設值的情況下,從連接池中獲取多個目標連接,其中,目標連接是連接池中的空閑連接;利用多個目標連接,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。建立服務器與分布式數(shù)據(jù)庫之間的連接池,連接池中包含多個連接,上述數(shù)據(jù)傳輸資源即為連接。當緩沖區(qū)的緩沖量達到預設值時,從連接池中獲取空閑連接,獲取到的空閑連接即為目標連接,利用多個目標連接,將日志文件保存至分布式數(shù)據(jù)庫的 目標文件中。連接是一種關鍵的有限的昂貴的資源,對連接的管理能顯著地影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。連接池負責分配、管理和釋放連接,它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再建立一個,避免了資源浪費,且能提升應用程序的性能。可選地,服務器為多個,獲取服務器記錄的日志文件包括:獲取服務器Sj記錄的日志文件,其中,j依次取1至n,n為服務器的數(shù)量,在分布式數(shù)據(jù)庫中創(chuàng)建目標文件包括:在分布式數(shù)據(jù)庫中創(chuàng)建子目標文件D1至子目標文件Dn,其中,子目標文件D1至子目標文件Dn構成目標文件,建立服務器與分布式數(shù)據(jù)庫之間的連接池包括:建立服務器Sj與分布式數(shù)據(jù)庫之間的連接池Pj,利用多個目標連接,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中包括:利用從連接池Pj中獲取到的目標連接,將服務器Sj記錄的日志文件保存至分布式數(shù)據(jù)庫的子目標文件Dj中。本申請實施例所提供的日志文件的保存方法可同時保存不同服務器記錄的日志文件,具體說明如下。服務器S1至服務器Sn為n個不同的服務器,需要將這n個服務器記錄的日志文件保存至分布式數(shù)據(jù)庫中。在分布式數(shù)據(jù)庫中的目標文件下建立n個子目標文件,這n個子目標文件分別為子目標文件D1至子目標文件Dn。子目標文件D1用來保存服務器S1的日志文件,子目標文件D2用來保存服務器S2的日志文件,子目標文件D3用來保存服務器S3的日志文件,以此類推,子目標文件Dn用來保存服務器Sn的日志文件。在每個服務器與分布式數(shù)據(jù)庫之間都建立一個連接池,一共建立了n個連接池,這n個連接池分別為連接池P1、連接池P2、……、連接池Pn。其中,連接池P1是服務器S1與分布式數(shù)據(jù)庫之間的連接池,連接池P2是服務器S2與分布式數(shù)據(jù)庫之間的連接池,連接池P3是服務器S3與分布式數(shù)據(jù)庫之間的連接池,以此類推,連接池Pn是服務器Sn與分布式數(shù)據(jù)庫之間的連接池。這n個連接池中,每個連接池均包含至少一個連接。連接池Pi中包含m(i)個連接,分別為連接C1-i、連接Ci-2、連接Ci-3、......、連接Ci-m(i)。例如,假設一共有3個不同的服務器,則n為3,連接池P1是服務器S1與分布式數(shù)據(jù)庫之間的連接池,連接池P1中包含了6個連接,即m(1)=6,這6個連接分別為連接C1-1、連接C1-2、連接C1-3、連接C1-4、連接C1-5和連接C1-6。連接池P2是服務器S2與分布式數(shù)據(jù)庫之間的連接池,連接池P2中包含了3個連接,即m(2)=3,這3個連接分別為連接C2-1、連接C2-2和連接C2-3。連接池P3是服務器S3與分布式數(shù)據(jù)庫之間的連接池,連接池P3中包含了4個連接,即m(3)=4,這4個連接分別為連接C3-1、連接C3-2、連接C3-3和連接C3-4。連接池P1中的6個連接中均包含了服務器S1的標識信息,連接池P2中的3個連接中均包含了服務器S2的標識信息,連接池P3中的4個連接中均包含了服務器S3的標識信息,根據(jù)連接中包含的標識信息,可以判斷出該連接是哪個服務器與分布式數(shù)據(jù)庫之間的連接,然后將該服務器記錄的日志文件保存至分布式數(shù)據(jù)庫中相應的子目標文件中,即把服務器S1記錄的日志文件保存至子目標文件D1,把服務器S2記錄的日志文件保存至子目標文件D2,把服務器S3記錄的日志文件保存至子目標文件D3。通過將不同服務器記錄的日志文件保存至相應的子目標文件,使得日志文件的保存清楚有條理,在以后查詢?nèi)罩疚募r,也非常方便。例如,當需要查詢某一個服務器的日志文件,只需要查詢該服務器對應的子目標文件,不需要再對整個目標文件進行查詢,可以加快查詢速度,提高查詢效率??蛇x地,利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中包括:利用數(shù)據(jù)傳輸資源,以異步傳輸方式將日志文件中的多條數(shù)據(jù)批量保存至分布式數(shù)據(jù)庫的目標文件中。將日志文件中的多條數(shù)據(jù)進行異步批量處理,能夠大大加快數(shù)據(jù)處理的速度,從而更加高效地將日志文件保存至分布式數(shù)據(jù)庫。例如,可以設置批大小BatchSize為2000,即每次數(shù)據(jù)交互,處理2000條數(shù)據(jù)。在建立服務器與分布式數(shù)據(jù)庫之間的連接時,有兩個實現(xiàn)方法:(1)一個方法是publicvoidinvoke(Requestrequest,Responseresponse),這個負責將請求轉(zhuǎn)發(fā)下去;(2)另外一個方法:publicvoidlog(Requestrequest,Responseresponse,longtime)。將實現(xiàn)的HbaseAccessLogValve打成jar包放到tomcat目錄下的lib里,將Hbase客戶端jar包及其依賴的jar包也放進tomcat目錄下的lib里。在Tomcat的conf文件夾中的server.xml標簽<Host></Host>中增加以下配置<ValveclassName="com.gridsum.tomcat.valves.HbaseAccessLogValve"zkQuorum="192.168.1.100"zkClientPort="2181"maxConnections="10"batchSize="1000"tableName="access_log"columeFamily="logInfo"/>其中,maxConnections="10"表示最大連接數(shù)是10。batchSize="1000"表示批大小為1000,即每次數(shù)據(jù)交互,處理1000條數(shù)據(jù)。tableName="access_log"表示在HBase中創(chuàng)建的表的表名是"access_log"。columeFamily="logInfo"表示在HBase中創(chuàng)建的表的列族的名字是"logInfo"。根據(jù)本發(fā)明實施例,還提供了一種日志文件的保存裝置。該日志文件的保存裝置可以執(zhí)行上述日志文件的保存方法,上述日志文件的保存方法也可以通過該日志文件的保存裝置實施。圖2是根據(jù)本申請實施例的日志文件的保存裝置的示意圖。如圖2所示,該裝置包括第一獲取單元22、創(chuàng)建單元24、第二獲取單元26和保存單元28。第一獲取單元22用于獲取服務器記錄的日志文件。服務器記錄的日志文件可以為用戶的訪問日志,也可以為服務器的運行日志。創(chuàng)建單元24用于在分布式數(shù)據(jù)庫中創(chuàng)建目標文件,其中,目標文件用于存儲日志文件。分布式數(shù)據(jù)庫可以為HBase、Cassandra、HyperTable等。在需要存儲的文件的數(shù)據(jù)量非常大的情況下,對數(shù)據(jù)庫做分庫分表十分麻煩,使用HBase等分布式數(shù)據(jù)庫,避免了對數(shù)據(jù)庫做分庫分表,從而提高了保存數(shù)據(jù)的效率。目標文件可以為表。第二獲取單元26用于獲取服務器與分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源。保存單元28用于利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。HBase是一個分布式的、面向列的數(shù)據(jù)庫,它和一般關系型數(shù)據(jù)庫的最大區(qū)別是:HBase很適合于存儲非結(jié)構化的數(shù)據(jù),還有它是基于列而不是基于行的模式。Rowkey是一段二進制碼流,最大長度為64KB,內(nèi)容可以由使用的用戶自定義。數(shù)據(jù)加載時,一般也是根據(jù)Rowkey(行鍵)的二進制序由小到大進行的。HBase是根據(jù)Rowkey來進行檢索的,系統(tǒng)通過找到某個Rowkey(或者某個Rowkey范圍)所在的Region(區(qū)域),然后將查詢數(shù)據(jù)的請求路由到該Region獲取數(shù)據(jù)。HBase的檢索支持3種方式:(1)通過單個Rowkey訪問,即按照某個Rowkey鍵值進行get操作,這樣獲取唯一一條記錄;(2)通過Rowkey的范圍進行掃描,即通過設置startRowKey(開始行鍵)和 endRowKey(結(jié)束行鍵),在這個范圍內(nèi)進行掃描,這樣可以按指定的條件獲取一批記錄;(3)全表掃描,即直接掃描整張表中所有行記錄。HBase按單個Rowkey檢索的效率是很高的,耗時在1毫秒以下,每秒鐘可獲取1000-2000條記錄。通過巧妙地設計Rowkey,使獲取的文件中的數(shù)據(jù)挨在一起(應該在同一個Region下),可以在遍歷結(jié)果時獲得很好的性能。通過獲取服務器記錄的日志文件,在分布式數(shù)據(jù)庫中創(chuàng)建用于存儲日志文件的目標文件,獲取服務器和分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源,利用該數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中,由于避免了對數(shù)據(jù)庫做分庫分表,因此能夠?qū)⒎掌饔涗浀娜罩疚募焖俑咝У乇4嬷练植际綌?shù)據(jù)庫中,實現(xiàn)了將服務器記錄的日志文件快速高效地保存至分布式數(shù)據(jù)庫中的技術效果,進而解決了現(xiàn)有技術中無法快速高效地保存服務器的日志文件的技術問題??蛇x地,本申請實施例所提供的日志文件的保存裝置還包括存儲單元和判斷單元。存儲單元用于在保存單元利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中之前,將日志文件存儲至服務器的緩沖區(qū)。判斷單元用于判斷緩沖區(qū)的緩沖量是否達到預設值。保存單元包括第一保存子單元。該第一保存子單元用于當判斷單元判斷出緩沖區(qū)的緩沖量達到預設值時,通過數(shù)據(jù)傳輸資源,將存儲在緩沖區(qū)中的日志文件保存至分布式數(shù)據(jù)庫的目標文件中。在利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中之前,先將日志文件存儲至服務器的緩沖區(qū),并在緩沖區(qū)的緩沖量達到預設值之后,利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。預設值可預先設置,在緩沖區(qū)的最大緩沖量為M單位時,可以設置預設值為0.5M、0.6M、0.7M或0.8M等。預設值同時也是閾值,即當緩沖區(qū)的緩沖量達到該閾值后,將緩沖區(qū)中的日志文件存儲至分布式數(shù)據(jù)庫。例如,設置預設值為最大緩沖量的60%,將日志文件存儲至緩沖區(qū),在緩沖區(qū)的緩沖量達到最大緩沖量的60%之后,利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。由于CPU的速度快,而I/O(輸入/輸出端口,英文全稱為input/output)設備速度慢,因此容易由于通道不足而產(chǎn)生“瓶頸”現(xiàn)象。通過使用緩沖區(qū),可以改善CPU和I/O設備之間速度不匹配的問題,減少I/O設備對CPU的中斷次數(shù),從而提升了CPU的 工作效率,因此提升了服務器的性能,使用戶訪問服務器更加高效,提升了用戶體驗。為緩沖區(qū)的緩沖量設置閾值,可以在緩沖量達到閾值時及時將緩沖區(qū)中存儲的日志文件傳輸至分布式數(shù)據(jù)庫,避免緩沖區(qū)的緩沖量達到最大值后日志文件中的數(shù)據(jù)不能被保存下來而丟失??蛇x地,本申請實施例所提供的日志文件的保存裝置還包括建立單元。該建立單元用于在第二獲取單元獲取服務器與分布式數(shù)據(jù)庫之間的數(shù)據(jù)傳輸資源之前,建立服務器與分布式數(shù)據(jù)庫之間的連接池,其中,連接池中包含多個連接,數(shù)據(jù)傳輸資源為連接。第一保存子單元包括獲取模塊和保存模塊。獲取模塊用于當判斷單元判斷出緩沖區(qū)的緩沖量達到預設值時,從連接池中獲取多個目標連接,其中,目標連接是連接池中的空閑連接。保存模塊用于利用獲取模塊獲取的多個目標連接,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。建立服務器與分布式數(shù)據(jù)庫之間的連接池,連接池中包含多個連接,上述數(shù)據(jù)傳輸資源即為連接。當緩沖區(qū)的緩沖量達到預設值時,從連接池中獲取空閑連接,獲取到的空閑連接即為目標連接,利用多個目標連接,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。連接是一種關鍵的有限的昂貴的資源,對連接的管理能顯著地影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。連接池負責分配、管理和釋放連接,它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再建立一個,避免了資源浪費,且能提升應用程序的性能??蛇x地,服務器為多個。第一獲取單元包括第一獲取子單元。該第一獲取子單元用于獲取服務器Sj記錄的日志文件,其中,j依次取1至n,n為服務器的數(shù)量。創(chuàng)建單元包括創(chuàng)建子單元。該創(chuàng)建子單元,用于在分布式數(shù)據(jù)庫中創(chuàng)建子目標文件D1至子目標文件Dn,其中,子目標文件D1至子目標文件Dn構成目標文件。建立單元包括建立子單元。該建立子單元,用于建立服務器Sj與分布式數(shù)據(jù)庫之間的連接池Pj。保存模塊包括保存子模塊。該保存子模塊用于利用獲取模塊從連接池Pj中獲取到的目標連接,將服務器Sj記錄的日志文件保存至分布式數(shù)據(jù)庫的子目標文件Dj中。本申請實施例所提供的日志文件的保存裝置可同時保存不同服務器記錄的日志文件,具體說明如下。服務器S1至服務器Sn為n個不同的服務器,需要將這n個服務器記錄的日志文件保存至分布式數(shù)據(jù)庫中。在分布式數(shù)據(jù)庫中的目標文件下建立n個子目標文件,這n個子目標文件分別為子目標文件D1至子目標文件Dn。子目標文件D1用來保存服務器S1的日志文件,子目標文件D2用來保存服務器S2的日志文件, 子目標文件D3用來保存服務器S3的日志文件,以此類推,子目標文件Dn用來保存服務器Sn的日志文件。在每個服務器與分布式數(shù)據(jù)庫之間都建立一個連接池,一共建立了n個連接池,這n個連接池分別為連接池P1、連接池P2、……、連接池Pn。其中,連接池P1是服務器S1與分布式數(shù)據(jù)庫之間的連接池,連接池P2是服務器S2與分布式數(shù)據(jù)庫之間的連接池,連接池P3是服務器S3與分布式數(shù)據(jù)庫之間的連接池,以此類推,連接池Pn是服務器Sn與分布式數(shù)據(jù)庫之間的連接池。這n個連接池中,每個連接池均包含至少一個連接。連接池Pi中包含m(i)個連接,分別為連接C1-i、連接Ci-2、連接Ci-3、......、連接Ci-m(i)。例如,假設一共有3個不同的服務器,則n為3,連接池P1是服務器S1與分布式數(shù)據(jù)庫之間的連接池,連接池P1中包含了6個連接,即m(1)=6,這6個連接分別為連接C1-1、連接C1-2、連接C1-3、連接C1-4、連接C1-5和連接C1-6。連接池P2是服務器S2與分布式數(shù)據(jù)庫之間的連接池,連接池P2中包含了3個連接,即m(2)=3,這3個連接分別為連接C2-1、連接C2-2和連接C2-3。連接池P3是服務器S3與分布式數(shù)據(jù)庫之間的連接池,連接池P3中包含了4個連接,即m(3)=4,這4個連接分別為連接C3-1、連接C3-2、連接C3-3和連接C3-4。連接池P1中的6個連接中均包含了服務器S1的標識信息,連接池P2中的3個連接中均包含了服務器S2的標識信息,連接池P3中的4個連接中均包含了服務器S3的標識信息,根據(jù)連接中包含的標識信息,可以判斷出該連接是哪個服務器與分布式數(shù)據(jù)庫之間的連接,然后將該服務器記錄的日志文件保存至分布式數(shù)據(jù)庫中相應的子目標文件中,即把服務器S1記錄的日志文件保存至子目標文件D1,把服務器S2記錄的日志文件保存至子目標文件D2,把服務器S3記錄的日志文件保存至子目標文件D3。通過將不同服務器記錄的日志文件保存至相應的子目標文件,使得日志文件的保存清楚有條理,在以后查詢?nèi)罩疚募r,也非常方便。例如,當需要查詢某一個服務器的日志文件,只需要查詢該服務器對應的子目標文件,不需要再對整個目標文件進行查詢,可以加快查詢速度,提高查詢效率??蛇x地,保存單元還包括第二保存子單元。該第二保存子單元用于利用數(shù)據(jù)傳輸資源,以異步傳輸方式將日志文件中的多條數(shù)據(jù)批量保存至分布式數(shù)據(jù)庫的目標文件中。將日志文件中的多條數(shù)據(jù)進行異步批量處理,能夠大大加快數(shù)據(jù)處理的速度,從 而更加高效地將日志文件保存至分布式數(shù)據(jù)庫。例如,可以設置批大小BatchSize為2000,即每次數(shù)據(jù)交互,處理2000條數(shù)據(jù)。在建立服務器與分布式數(shù)據(jù)庫之間的連接時,有兩個實現(xiàn)方法:(1)一個方法是publicvoidinvoke(Requestrequest,Responseresponse),這個負責將請求轉(zhuǎn)發(fā)下去;(2)另外一個方法:publicvoidlog(Requestrequest,Responseresponse,longtime)。將實現(xiàn)的HbaseAccessLogValve打成jar包放到tomcat目錄下的lib里,將Hbase客戶端jar包及其依賴的jar包也放進tomcat目錄下的lib里。在Tomcat的conf文件夾中的server.xml標簽<Host></Host>中增加以下配置<ValveclassName="com.gridsum.tomcat.valves.HbaseAccessLogValve"zkQuorum="192.168.1.100"zkClientPort="2181"maxConnections="10"batchSize="1000"tableName="access_log"columeFamily="logInfo"/>其中,maxConnections="10"表示最大連接數(shù)是10。batchSize="1000"表示批大小為1000,即每次數(shù)據(jù)交互,處理1000條數(shù)據(jù)。tableName="access_log"表示在HBase中創(chuàng)建的表的表名是"access_log"。columeFamily="logInfo"表示在HBase中創(chuàng)建的表的列族的名字是"logInfo"。所述日志文件的保存裝置包括處理器和存儲器,上述第一獲取單元22、創(chuàng)建單元24、第二獲取單元26和保存單元28等均作為程序單元存儲在存儲器中,由處理器執(zhí)行存儲在存儲器中的上述程序單元來實現(xiàn)相應的功能。處理器中包含內(nèi)核,由內(nèi)核去存儲器中調(diào)取相應的程序單元。內(nèi)核可以設置一個或以上,通過調(diào)整內(nèi)核參數(shù)來保存日志文件。存儲器可能包括計算機可讀介質(zhì)中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flashRAM),存儲器包括至少一個存儲芯片。本申請還提供了一種計算機程序產(chǎn)品,當在數(shù)據(jù)處理設備上執(zhí)行時,適于執(zhí)行初始化有如下方法步驟的程序代碼:獲取服務器記錄的日志文件;在分布式數(shù)據(jù)庫中創(chuàng)建目標文件,其中,目標文件用于存儲日志文件;獲取服務器與分布式數(shù)據(jù)庫之間的 數(shù)據(jù)傳輸資源;以及利用數(shù)據(jù)傳輸資源,將日志文件保存至分布式數(shù)據(jù)庫的目標文件中。上述本申請實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。在本申請的上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關描述。在本申請所提供的幾個實施例中,應該理解到,所揭露的技術內(nèi)容,可通過其它的方式實現(xiàn)。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。另外,在本申請各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本申請的技術方案本質(zhì)上或者說對現(xiàn)有技術做出貢獻的部分或者該技術方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設備(可為個人計算機、服務器或者網(wǎng)絡設備等)執(zhí)行本申請各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、只讀存儲器(ROM,Read-OnlyMemory)、隨機存取存儲器(RAM,RandomAccessMemory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。以上所述僅是本申請的優(yōu)選實施方式,應當指出,對于本
技術領域:
:的普通技術人員來說,在不脫離本申請原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本申請的保護范圍。當前第1頁1 2 3 當前第1頁1 2 3