一種日志采集方法、裝置及日志服務(wù)系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及網(wǎng)絡(luò)技術(shù)領(lǐng)域,尤其涉及一種日志采集方法、裝置及日志服務(wù)系統(tǒng)。
【背景技術(shù)】
[0002]應(yīng)用系統(tǒng)中,日志是不可缺少的重要組成部分,所有Java應(yīng)用程序的出錯(cuò)信息等都應(yīng)該能在日志文件中查找到,目前,絕大多數(shù)Java應(yīng)用程序在運(yùn)行過(guò)程中都會(huì)采用日志框架來(lái)生成各種日志文件。
[0003]但是,現(xiàn)有日志框架都采用jar集成的方式包含在第三方組件(如mina或netty)中,這導(dǎo)致Java應(yīng)用程序在運(yùn)行過(guò)程需要先強(qiáng)制性地引入第三方組件,然后在應(yīng)用程序中配置相應(yīng)的參數(shù),調(diào)用第三方組件提供的應(yīng)用程序編程接口(Applicat1n ProgrammingInterface, API)函數(shù),通過(guò)查找第三方組件中的日志框架來(lái)生成日志文件,由于應(yīng)用程序和日志框架時(shí)均需要引入第三方組件,比如雙方都引用netty或mina等第三方組件時(shí),因各自引用的版本不一致,易導(dǎo)致引用沖突。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的主要目的,在于提供一種日志采集方法、裝置及日志服務(wù)系統(tǒng),解決了現(xiàn)有日志采集過(guò)程中,需引入第三方組件導(dǎo)致引用沖突的問(wèn)題。
[0005]為達(dá)到上述目的,本發(fā)明的實(shí)施例采用如下技術(shù)方案:
[0006]第一方面,本發(fā)明實(shí)施例提供一種日志米集方法,包括:
[0007]加載java應(yīng)用程序的類文件;
[0008]判斷所述類文件是否在日志采集的監(jiān)控范圍內(nèi);
[0009]若確定所述類文件在日志采集的監(jiān)控范圍內(nèi),則獲取所述類文件的所有類方法,確定所述所有類方法中是否存在需進(jìn)行日志采集的類方法;
[0010]若所述所有類方法中存在需進(jìn)行日志采集的方法,則在需進(jìn)行日志采集的類方法中植入日志采集代碼,形成新的類文件;
[0011]加載所述新的類文件進(jìn)行日志采集。
[0012]第二方面,本發(fā)明實(shí)施例提供一種日志采集裝置,包括:
[0013]類加載器:用于加載java應(yīng)用程序的類文件;
[0014]判斷單元:用于判斷所述類文件是否在日志采集的監(jiān)控范圍內(nèi);
[0015]解析單元:用于當(dāng)所述判斷單元確定所述類文件在日志采集的監(jiān)控范圍內(nèi)時(shí),獲取所述類文件的所有類方法,確定所述所有類方法中是否存在需進(jìn)行日志采集的類方法;
[0016]代碼植入單元:用于當(dāng)所述解析單元確定所述所有類方法中存在需進(jìn)行日志采集的方法時(shí),在需進(jìn)行日志采集的類方法中植入日志采集代碼,形成新的類文件;
[0017]所述類加載單元,還用于加載所述新的類文件進(jìn)行日志采集。
[0018]第三方面,本發(fā)明實(shí)施例還提供一種日志服務(wù)系統(tǒng),所述日志服務(wù)系統(tǒng)包括:如第二方面所述的日志采集裝置、Kafka集群、以及日志應(yīng)用裝置。
[0019]所述日志采集裝置,用于通過(guò)異步傳輸?shù)姆绞綄⒉杉降娜罩拘畔l(fā)送至Kafka集群中的消息隊(duì)列中;
[0020]所述日志應(yīng)用裝置,用于讀取所述Kafka集群消息隊(duì)列中的日志消息進(jìn)行消費(fèi)。[0021 ] 由上可知,本發(fā)明實(shí)施例提供一種日志采集方法、裝置及日志服務(wù)系統(tǒng),所述日志采集方法由日志采集裝置中的JVM執(zhí)行,JVM先加載java應(yīng)用程序的類文件,當(dāng)確定所述類文件在日志采集的監(jiān)控范圍內(nèi),且所述類文件的所有類方法存在需進(jìn)行日志采集的類方法時(shí),將日志采集代碼植入類方法中,形成新的類文件,重新加載新的類文件進(jìn)行日志采集。在本發(fā)明的日志采集過(guò)程中,不需要事先引進(jìn)第三組件,而是在需要進(jìn)行日志采集的地方才加載日志采集代碼,實(shí)現(xiàn)零耦合的日志采集文件的動(dòng)態(tài)加載,避免了現(xiàn)有日志采集過(guò)程中,需引入第三方組件導(dǎo)致引用沖突的問(wèn)題。
【附圖說(shuō)明】
[0022]為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0023]圖1為本發(fā)明實(shí)施例提供的日志服務(wù)系統(tǒng)原理框圖;
[0024]圖2為本發(fā)明實(shí)施例提供的日志采集裝置的結(jié)構(gòu)圖;
[0025]圖3為本發(fā)明實(shí)施例提供的日志采集方法的流程圖;
[0026]圖4為本發(fā)明實(shí)施例提供的日志采集裝置10的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0027]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0028]首先,為了便于理解本發(fā)明所述的技術(shù)方案,對(duì)本發(fā)明中的一些重要名詞進(jìn)行詳細(xì)解釋:
[0029]宿主機(jī)(Host):作為管理層,用以完成硬件資源的管理、分配;Sjava虛擬機(jī)呈現(xiàn)虛擬硬件平臺(tái);實(shí)現(xiàn)虛擬機(jī)的調(diào)度和隔離。其中,Host可能是虛擬機(jī)監(jiān)控器(VMM);虛擬硬件平臺(tái)對(duì)其上運(yùn)行的各個(gè)Java虛擬機(jī)提供各種硬件資源,如提供虛擬處理器(如VCPU)、虛擬內(nèi)存、虛擬磁盤等等。其中,該虛擬磁盤可對(duì)應(yīng)Host的一個(gè)文件或者一個(gè)邏輯塊設(shè)備。Java虛擬機(jī)運(yùn)行在Host為其準(zhǔn)備的虛擬硬件平臺(tái)上,Host上運(yùn)行一個(gè)或多個(gè)Java虛擬機(jī)。
[0030]Java虛擬機(jī)(Java Virtual Machine,JVM):可運(yùn)行java代碼的虛擬計(jì)算機(jī),只要根據(jù)JVM規(guī)格描述將解釋器移植到特定的計(jì)算機(jī)上,就能保證經(jīng)過(guò)編譯的任何java代碼能夠在該系統(tǒng)上運(yùn)行,JVM擁有自己完善的硬件架構(gòu),如處理器、堆棧、寄存器等,并且還具有相應(yīng)的指令系統(tǒng)。
[0031]類(class)文件:java類文件,用于存儲(chǔ)java程序運(yùn)行時(shí)代碼指令集的文件,可通過(guò)類裝載器加載到JVM上。
[0032]類裝載器:java類裝載器,由于java程序包含很多的類文件,并且這些類文件不像靜態(tài)的C程序一次性裝載入JVM內(nèi)存,它們只有在需要的時(shí)候才裝載,java類裝載器先從類文件中獲取不依賴平臺(tái)的字節(jié)碼,然后將它們裝載到JVM內(nèi)存空間運(yùn)行。
[0033]jar文件:包含多個(gè)java類文件和相關(guān)資源的同一存儲(chǔ)庫(kù),是java程序組件分發(fā)的一種通用形式。
[0034]java虛擬機(jī)工具接口:(Java Virtual Machine Toolkit Interface,JVM TI),是監(jiān)控虛擬機(jī)運(yùn)行狀態(tài)的接口,是JDK提供的一套用于開發(fā)JVM監(jiān)控、問(wèn)題定位與性能調(diào)優(yōu)的通用編程接口(Applicat1n Programming Interface,API)。通過(guò) JVM TI,我們可以開發(fā)各式各樣的JVMTI Agent。這個(gè)Agent的表現(xiàn)形式是一個(gè)以c/c++語(yǔ)言編寫的動(dòng)態(tài)共享庫(kù)(dynamic module),在java啟動(dòng)或運(yùn)行時(shí),可動(dòng)態(tài)加載dynamic module到Java進(jìn)程內(nèi),然后觸發(fā)JVM源生線程Attach Listener來(lái)執(zhí)行這個(gè)dynamic module的回調(diào)函數(shù)。在函數(shù)體內(nèi),你可以獲取各種各樣的JVM級(jí)信息,注冊(cè)感興趣的JVM事件,甚至控制JVM的行為。
[0035]需要理解的是,上述名詞僅是本領(lǐng)域技術(shù)人員為了描述方便常用的命名,并不代表或暗示所指的系統(tǒng)或元件必須有此命名,因此不能理解為對(duì)本發(fā)明的限制。
[0036]通常情況下,一個(gè)完整的日志服務(wù)過(guò)程可以包括兩大部分:日志生產(chǎn)和日志消費(fèi),其中,日志生產(chǎn)是指:通過(guò)對(duì)應(yīng)用程序的日志采集生成相應(yīng)的日志信息(如運(yùn)行棧過(guò)程