黃 淼,徐向藝,馬 麗
(平頂山學院 軟件學院,河南 平頂山 467000)
目前很多電信公司都提供了Open Lab出租業(yè)務(wù),由于大型服務(wù)器購買昂貴,許多中小型公司都采用租用服務(wù)的方式經(jīng)營。電信公司提供一項叫做Unix服務(wù)器的出租業(yè)務(wù),需要使用Unix實驗室出租業(yè)務(wù)的客戶,通過電信公司提供的賬號和密碼遠程登錄指定的Unix機器,并使用Unix服務(wù)。電信運營商根據(jù)用戶的使用時長進行收費。由于Unix服務(wù)器上記錄的用戶登錄日志信息中的數(shù)據(jù)都是流水賬數(shù)據(jù),而且用戶數(shù)量較多,使得數(shù)據(jù)信息量十分龐大。為了得到有序排列的用戶信息數(shù)據(jù),為日后計費提供可靠的數(shù)據(jù)支持,所以非常有必要開發(fā)一個數(shù)據(jù)采集系統(tǒng),用于采集從Unix服務(wù)器上記錄的用戶登錄日志信息中提取與用戶計費相關(guān)的信息,以便后期將這些數(shù)據(jù)轉(zhuǎn)移到數(shù)據(jù)庫中存儲為計費做準備[1]。
電信公司通過數(shù)據(jù)采集系統(tǒng)需要最終得到的關(guān)鍵信息是各個用戶的在線時長,然后用來作為電信的收費依據(jù)。能夠提供該信息的是Unix服務(wù)器自帶的用戶信息記錄日志文件wtmpx。該文件記錄了每次用戶登錄的OS賬號、進程ID、登入時刻、登出時刻和登錄終端機器IP。
數(shù)據(jù)采集系統(tǒng)客戶端需要對這些采集到的用戶信息成批進行讀取,讀取一批數(shù)據(jù)后對采集到的成對登錄登出數(shù)據(jù)進行匹配,然后將匹配成功的數(shù)據(jù)信息發(fā)送給數(shù)據(jù)采集服務(wù)器。匹配不成功的單條記錄進一步同下一批日志數(shù)據(jù)一起進行下一次匹配發(fā)送處理。數(shù)據(jù)采集服務(wù)器接受客戶端發(fā)送過來的成對數(shù)據(jù)并提供數(shù)據(jù)的接收監(jiān)控顯示功能,并將成對數(shù)據(jù)存入相應(yīng)的數(shù)據(jù)庫保存,為收費提供數(shù)據(jù)管理和支持。
日志文件wtmpx是實時動態(tài)增長的,每372字節(jié)的數(shù)據(jù)代表一條登入/登出記錄。因此,數(shù)據(jù)采集端程序從日志文件中讀取數(shù)據(jù)時,只需要讀取從上次讀取到本次讀取之間所產(chǎn)生的最新的日志數(shù)據(jù)。即,采集端程序需要從上次讀取的末尾位置開始讀取,以每372字節(jié)的數(shù)據(jù)為單位進行讀取,直到接近文件末尾。正因為日志文件是實時動態(tài)增長的,如果讀至文件末尾,數(shù)據(jù)并非372字節(jié)的倍數(shù),則表示一條登錄數(shù)據(jù)尚未完全形成,因此,只需要讀至上一個372字節(jié)的數(shù)據(jù)即可。數(shù)據(jù)采集端程序讀取日志文件的過程如圖1所示。
圖1 日志文件讀取過程Fig.1 Log file reading process
圖1中突出顯示字體1000部分表示上次讀取的末尾位置,則本次讀取從此開始。因為日志文件的動態(tài)增長,以至于本次讀取時,最后一條數(shù)據(jù)尚不是完整記錄,因此,只讀取到上一條登入/登出記錄即可。采集端程序從日志文件wtmpx中得到數(shù)據(jù)后,將數(shù)據(jù)存為臨時日志文件temp.log,然后進行數(shù)據(jù)解析。該文件中包含多條登入/登出記錄,每條記錄(每372字節(jié))中需要采集的信息有:登錄的OS賬號、登錄的進程 ID、登錄/登出的時間、登錄期間的在線時間、終端IP。這些需要采集的數(shù)據(jù)信息在每372長度的字節(jié)中的位置如表1所示。
表1 采集的數(shù)據(jù)位置信息表Tab.1 Data collected by position information table
Unix服務(wù)器自帶的文件中包含的用戶信息是數(shù)據(jù)采集系統(tǒng)將要讀取的關(guān)鍵數(shù)據(jù),對該文件的解析是系統(tǒng)設(shè)計的前提。該文件是一個二進制文件,從表1中可以看出,系統(tǒng)需要采集的5個數(shù)據(jù)項在文件中的一條登錄登出記錄項的地址是不連續(xù)的,在設(shè)計系統(tǒng)時,必須針對這幾個數(shù)據(jù)項的地址和各自的大小進行讀取[2-3]。
根據(jù)系統(tǒng)的需求分析得出,該數(shù)據(jù)采集系統(tǒng)是一個基于“客戶端-服務(wù)器”架構(gòu)的數(shù)據(jù)挖掘系統(tǒng),由數(shù)據(jù)采集客戶端和數(shù)據(jù)采集服務(wù)器端兩部分組成。
數(shù)據(jù)采集客戶端的主要功能為:
1)定期讀取日志文件,得到最新的日志數(shù)據(jù)(從上一次讀取后的位置開始讀取);
2)提取并解析日志文件中的數(shù)據(jù);
3)如果有未匹配的日志文件,則將解析后的登錄日志數(shù)據(jù)和未匹配的日志文件數(shù)據(jù)合并;
4)將這些記錄匹配為完整的登錄會話記錄(一次登錄會話包含一次登入記錄和一次登出記錄);
5)提交匹配后的日志數(shù)據(jù)到服務(wù)器。
數(shù)據(jù)采集客戶端的系統(tǒng)功能如圖2所示。
圖2 數(shù)據(jù)采集客戶端系統(tǒng)功能流程圖Fig.2 The flow chart of data collection client system function
數(shù)據(jù)采集服務(wù)器端的主要功能為:
1)持續(xù)接收數(shù)據(jù)采集客戶端發(fā)來的登錄數(shù)據(jù),并記載登錄數(shù)據(jù);
2)顯示數(shù)據(jù)接收以及操作的結(jié)果,以實現(xiàn)數(shù)據(jù)監(jiān)控;
3)定期檢查所記載的登錄數(shù)據(jù),并將數(shù)據(jù)保存到歸檔日志文件logrecfile.txt中。
數(shù)據(jù)采集服務(wù)器端的系統(tǒng)功能如圖3所示。
圖3 數(shù)據(jù)采集服務(wù)器端功能Fig.3 The flow chart of data collection server system function
由以上分析得出,可以把系統(tǒng)設(shè)計分成以下幾個模塊:讀取日志模塊,匹配日志模塊,發(fā)送日志模塊,日志瀏覽監(jiān)控模塊、日志接收模塊,以及日志存儲模塊。
整個數(shù)據(jù)采集系統(tǒng)設(shè)計了7個類。分別是:
1)Log類:日志數(shù)據(jù)業(yè)務(wù)類,代表從日志中解析出來的日志記錄,每個日志記錄解析為一個Log對象。
2)LogPair類:"日志記錄對"業(yè)務(wù)對象,包含兩個登錄日志對,還包括登錄主機的IP地址。日志對中一個是登錄記錄,一個是登出記錄。
3)DMSClient類:采集客戶端核心業(yè)務(wù)程序,主要用于獲取日志數(shù)據(jù)、解析日志數(shù)據(jù)、匹配日志數(shù)據(jù)、以及向采集服務(wù)器發(fā)送日志數(shù)據(jù)。
4)DMSClientFrame類:采集客戶端界面,顯示采集數(shù)據(jù)以及發(fā)送數(shù)據(jù)的狀態(tài)信息。
5)DMSServer類:采集服務(wù)器接收程序,接收采集端發(fā)來的數(shù)據(jù),接收到數(shù)據(jù)以后寫入到文件中。
6)DMSServerFrame類:采集服務(wù)器界面,能夠顯示采集過程中的數(shù)據(jù)信息。
7)NetService類:設(shè)計網(wǎng)絡(luò)協(xié)議,提供數(shù)據(jù)發(fā)送和接受的格式[4]。
日志讀取模塊每次讀取原始文件的一部分。采用增量讀取,每一次讀取一批。讀取日志核心算法步驟描述如下:
1)檢查輸入數(shù)據(jù)文件是否存在。
2)檢查上次讀取結(jié)果log.txt是否存在,如果存在就說明上次的結(jié)果沒有處理完成,這次就不再讀取。
3)讀取上次的讀取位置(沒有的從開始位置讀?。?/p>
4)根據(jù)上次的讀取位置和文件長度判斷是否有新記錄產(chǎn)生。如果沒有新數(shù)據(jù)產(chǎn)生,就不讀取。
5)從上次讀取位置開始批量讀取日志到臨時文件,如果讀取到文件末尾就不讀取。
6)保存本次讀取的位置。7)改名臨時文件到log.txt。8)如果有異常一定不產(chǎn)生文件log.txt。
日志匹配模塊每次從日志讀取模塊產(chǎn)生的結(jié)果log.txt中讀取登錄登出數(shù)據(jù)中成對的數(shù)據(jù),最終產(chǎn)生匹配成功的成對數(shù)據(jù)文件matched.txt。其核心算法步驟描述如下:
1)檢查是否有輸入數(shù)據(jù)文件log.txt,如果沒有就返回。
2)檢查是否有輸出數(shù)據(jù)文件matched.txt,如果有返回。
3)如果有單條登錄記錄login.txt存在,讀取 login.txt到集合 logins, logouts。
4)讀取 log.txt到集合 logins, logouts。
5)迭代 logouts的key查找logins。如果找到,就是登錄對 matchedList<logPair>。找到從logins集合中刪除登錄記錄。
6)保存 matched集合到matched.txt。
7)保存 logins集合到login.txt
8)刪除 log.txt。
發(fā)送日志要用到網(wǎng)絡(luò),網(wǎng)絡(luò)協(xié)議的設(shè)計就是一項非常重要的工作。為了便于數(shù)據(jù)的封裝和擴展。網(wǎng)絡(luò)協(xié)議設(shè)計采用XML[5]作為協(xié)議數(shù)據(jù)封裝。設(shè)計了負責XML數(shù)據(jù)的發(fā)送和接收的NetService類。XML報文設(shè)計包含類型type、長度length和值value三項內(nèi)容。數(shù)據(jù)結(jié)構(gòu)設(shè)計如下:先發(fā)送類型type,設(shè)計每次發(fā)送10個Byte,再發(fā)送長度length為4個Byte的int類型數(shù)據(jù),最后發(fā)送value,節(jié)數(shù)量與length一致。發(fā)送數(shù)據(jù)方法 sendDocument(Document doc,Socket socket)將 xml doc通過socket的out流發(fā)送出去。其設(shè)計如下:
1)先發(fā)送定長的type數(shù)據(jù) "XML"到流中。
2)將xml doc寫入到內(nèi)存的緩沖區(qū)中,得到全部的Bytes數(shù)據(jù),同時得到數(shù)據(jù)的長度。
3)將int分成4個Byte發(fā)送到流中。
4)將XML的全部的Byte數(shù)據(jù)發(fā)送到流中。
1)先接收定長 type類型。如果type不是 "XML"就拋出異常。
2)接收4個Byte,合并為一個int,是長度信息length。
3)從流中接收length個Byte到數(shù)組緩沖區(qū)。
4)將數(shù)組緩沖區(qū)中的數(shù)據(jù),解析為XML doc。
需要將一個List全部的日志數(shù)據(jù)封裝起來發(fā)送到服務(wù)器。發(fā)送XML數(shù)據(jù)格式設(shè)計如下:
封裝服務(wù)器回送消息的接收XML數(shù)據(jù)格式設(shè)計如下:
日志發(fā)送模塊的核心算法描述如下:
1)檢查是否有被發(fā)送的數(shù)據(jù)文件matched.txt。如果沒有這個輸入數(shù)據(jù)文件,就不發(fā)送。如果有數(shù)據(jù),就讀取數(shù)據(jù)到集合中。
2)連接到服務(wù)器。
3)向服務(wù)器發(fā)送集合數(shù)據(jù)并等待響應(yīng)結(jié)果。如果響應(yīng)結(jié)果中包含消息OK則說明發(fā)送成功,刪除matched.txt。如果返回ERROR表示發(fā)送失敗,就不能刪除matched.txt。如果異常也不能刪除matched.txt。
數(shù)據(jù)采集服務(wù)端主要用來接受客戶端發(fā)送過來的日志數(shù)據(jù),由于數(shù)據(jù)要通過網(wǎng)絡(luò)傳輸,服務(wù)器端采用讀取配置文件的方式讀取相關(guān)的初始化配置參數(shù)。設(shè)計一個loadConfig()方法負責讀取并且初始化服務(wù)器參數(shù)。服務(wù)端主要任務(wù)流程如下:首先讀取配置文件信息,然后開始監(jiān)聽服務(wù)器網(wǎng)絡(luò)端口號,創(chuàng)建緩沖隊列和線程池。需要設(shè)計保存文件線程和客戶服務(wù)線程并將線程啟動。保存文件線程會檢查緩沖隊列,如果有數(shù)據(jù)就追加寫入到logFile。 如果有客戶端連接進來,就創(chuàng)建客戶端服務(wù)線程并提交到線程池執(zhí)行。客戶服務(wù)線程在執(zhí)行的時候,不斷接收用戶提交的數(shù)據(jù)并保存到緩沖隊列[6-7]。
數(shù)據(jù)采集系統(tǒng)客戶端在讀取、解析、匹配和發(fā)送數(shù)據(jù)后,還需要將數(shù)據(jù)操作的結(jié)果顯示在界面上以實現(xiàn)數(shù)據(jù)監(jiān)控,每次操作后,均在頁面上顯示本次操作的結(jié)果。其界面效果如圖4所示。
圖4 數(shù)據(jù)采集系統(tǒng)客戶端界面Fig.4 Data collection system is the client interface
數(shù)據(jù)采集系統(tǒng)服務(wù)器端程序?qū)崟r獲取采集端發(fā)來的數(shù)據(jù)。在得到采集端發(fā)來的數(shù)據(jù)后,保存數(shù)據(jù),并將采集端服務(wù)器的信息顯示在界面上以實現(xiàn)數(shù)據(jù)監(jiān)控。其界面效果如圖5所示。
圖5 數(shù)據(jù)采集系統(tǒng)服務(wù)器端界面Fig.5 Data collection system is the server interface
本文闡述了基于C/S模式的電信數(shù)據(jù)采集系統(tǒng)的開發(fā)過程。該系統(tǒng)在Windows操作系統(tǒng)下通過Java語言開發(fā)完成。實驗結(jié)果表明,該數(shù)據(jù)采集系統(tǒng)能夠從大量雜亂的日志數(shù)據(jù)中提取所需要的關(guān)鍵信息并對這些信息進行按規(guī)律整合,最后以GUI圖形界面的方式提供數(shù)據(jù)的瀏覽監(jiān)控顯示功能。極大地方便了后期的數(shù)據(jù)維護和計費管理。該系統(tǒng)還可以推廣到除電信業(yè)務(wù)以外的其它需要處理大數(shù)據(jù)的場合。比如倉庫的物流管理、企業(yè)的業(yè)績分析、學校的學生信息管理等。
[1]路鵬飛,李進.在線計費系統(tǒng)中余額分配算法的優(yōu)化[J].計算機工程,2011,37(7):282-284.LU Peng-fei,LI Jin.Online billing system balance allocation algorithm in the optimization[J].Computer Engineering,2011,37(7):282-284.
[2]周如培,馮同鑫.基于CORBA的電信計費系統(tǒng)的研究與開發(fā)[J].計算機應(yīng)用研究,2002(8):130-131.ZHOU Ru-pei,F(xiàn)ENG Tong-xin.The research and development of the telecommunication billing system based on CORBA[J].Computer Application Research,2002(8):130-131.
[3]張友生,李雄.軟件開發(fā)模型研究綜述[J].計算機工程與應(yīng)用,2006,42(3):17-19.ZHANG You-sheng,LI Xiong.Software development model studies reviewed[J].Computer Engineering and Application,2006,42(3):17-19.
[4]孫衛(wèi)琴.Java面向?qū)ο缶幊蘙M].電子工業(yè)出版社,2006.
[5]耿祥義.XML基礎(chǔ)教程[M].清華大學出版社,2006.
[6]CHEN Zhi-rui,TAN Hong-zhou.Logic structure of programmable instructions for Java[J].Journal of Electronics(China),2009,26(5):44-46.
[7]Little G,Miller R C.Keyword programming in Java[J].Automated Software Engineering,2009(3):32-35.