本申請涉及服務端業(yè)務打印技術領域,具體涉及一種日志打印方法。本申請同時涉及一種日志打印裝置及系統(tǒng)。
背景技術:
在服務端業(yè)務系統(tǒng)中,經(jīng)常會劃分出不同的層次來進行代碼的隔離和抽象。一個簡單的后端業(yè)務系統(tǒng)可分為服務層、領域?qū)雍蛿?shù)據(jù)層,這樣一個前臺請求會經(jīng)過后端業(yè)務系統(tǒng)三層處理,傳統(tǒng)的方式會在每一層的每一個實現(xiàn)類的代碼中手動指定一個日志打印logger,這樣打印日志不夠靈活、代碼重復,并且不能將一個業(yè)務請求鏈路的日志串寫在一個文件中,從而導致排查問題和進行業(yè)務監(jiān)控的時候耗時費力,浪費很多資源。
或者,業(yè)務系統(tǒng)日志不按照業(yè)務劃分打印,是通過aop或者各個層次寫死logger方式按照層次劃分打印的。一次業(yè)務請求最終打印的日志分散在多個文件中,排查問題查看日志需要grep多個文件才能查看完整鏈路,十分不方便。另外由于多個業(yè)務日志打印在同一個文件中,配置業(yè)務的監(jiān)控對監(jiān)控系統(tǒng)的性能壓力也較大。
因此,現(xiàn)有技術不能很好的實現(xiàn)一次業(yè)務請求鏈路上的所有日志都打印到一個文件中的效果,即使通過一定的方法實現(xiàn)上述效果,但是也需要在業(yè)務系統(tǒng)中額外增加代碼,給程序開發(fā)人員的業(yè)務代碼的開發(fā)造成嚴重的不便。
技術實現(xiàn)要素:
本申請?zhí)峁┮环N日志打印方法,以解決現(xiàn)有技術中存在的上述問題。
本申請另外提供一種日志打印裝置和系統(tǒng)。
本申請?zhí)峁┮环N日志打印方法,應用于業(yè)務系統(tǒng)中,所述業(yè)務系統(tǒng)包括多個層,所述方法包括:
接收業(yè)務請求;
根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件;
將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中。
可選的,所述將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中,包括:將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用相同的日志打印組件打印到同一日志文件中。
可選的,在所述根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件之后,執(zhí)行以下操作:
存儲所述日志打印組件以及該日志打印組件與對應的業(yè)務請求之間的對應關系;
所述將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中,包括:
在業(yè)務系統(tǒng)的不同層中,根據(jù)所述業(yè)務請求的類型確定該業(yè)務請求所對應的日志打印組件;
獲取不同層中的業(yè)務請求所產(chǎn)生的需要記錄的日志信息;
采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中。
可選的,所述業(yè)務系統(tǒng)的多個層中包括請求入口層和若干個被調(diào)用層;
所述請求入口層是所述業(yè)務請求的進入業(yè)務系統(tǒng)的起始層,并可調(diào)用所述被調(diào)用層;所述若干個被調(diào)用層至少部分層與層之間具有調(diào)用順序,按照調(diào)用順序依次被上一層所調(diào)用;
所述根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件,是在所述請求入口層進行的。
可選的,所述在業(yè)務系統(tǒng)的不同層中,根據(jù)所述業(yè)務請求的類型確定該業(yè)務請求所對應的日志打印組件包括:
將業(yè)務請求的請求參數(shù)作為接口參數(shù),根據(jù)所述調(diào)用順序依次調(diào)用不同層的業(yè)務系統(tǒng)中的層;
不同層分別根據(jù)所述業(yè)務請求的類型確定與該業(yè)務請求所對應的日志打印組件。
可選的,在所述采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中之后,執(zhí)行以下操作:
按照調(diào)用順序的反順序依次返回業(yè)務請求的結(jié)果;
被請求入口層調(diào)用的被調(diào)用層將業(yè)務請求的結(jié)果返回至請求入口層之后,所述請求入口層將業(yè)務請求的結(jié)果返回給請求方。
可選的,所述采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中,包括:根據(jù)所述調(diào)用順序,確定打印到日志文件中的日志信息的順序。
可選的,所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息中的日志信息采用以下方式獲取:
所述業(yè)務系統(tǒng)中不同層根據(jù)接收到的業(yè)務請求的請求參數(shù)進行相應層的業(yè)務調(diào)用,每層可獲取與請求參數(shù)對應的返回結(jié)果;
將所述請求參數(shù)與返回結(jié)果作為所述日志信息。
可選的,所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息中的日志信息還包括額外業(yè)務請求信息,所述額外業(yè)務請求信息是指請求方發(fā)送的額外業(yè)務請求所對應的指定的所需要打印的信息;
所述將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中包括:
在包含有所述額外業(yè)務請求的層,確定該額外業(yè)務請求對應的日志打印組件;
獲取所述額外請求業(yè)務對應的額外請求參數(shù)及返回的所需要打印的指定信息;
采用確定的所述日志打印組件將獲取的額外請求參數(shù)及返回的指定信息打印到與該額外業(yè)務請求所對應的日志文件中。
可選的,所述根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件包括:
獲取業(yè)務請求所對應的類型;
基于所述業(yè)務請求所對應的類型,采用預設方式設置該業(yè)務請求的接口方法以使得業(yè)務請求與相應的日志打印組件之間具有對應關系。
可選的,所述預設方式包括:采用注解的方式;或者,采用xml配置方式。
可選的,所述采用注解的方式,是在業(yè)務請求的接口方法上增加相應的日志打印組件的注解,以使業(yè)務請求與相應的日志打印組件之間具有對應關系。
可選的,采用預先設置的分層攔截方式為不同層設置日志攔截方式;
在所述接收業(yè)務請求之后,執(zhí)行以下操作:
不同層均采用所述日志攔截方式分別攔截相應層的業(yè)務請求,以執(zhí)行相應業(yè)務請求的日志打印任務。
本申請還提供一種日志打印裝置,該裝置包括:
業(yè)務請求接收單元,用于接收業(yè)務請求;
日志打印組件確定單元,用于根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件;
日志信息打印單元,用于將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中。
可選的,該裝置還包括:
存儲單元,用于在所述根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件之后,存儲所述日志打印組件以及該日志打印組件與對應的業(yè)務請求之間的對應關系;
所述日志信息打印單元包括:
日志打印組件獲取子單元,用于在業(yè)務系統(tǒng)的不同層中,根據(jù)所述業(yè)務請求的類型確定該業(yè)務請求所對應的日志打印組件;
日志信息獲取子單元,用于獲取不同層中的業(yè)務請求所產(chǎn)生的需要記錄的日志信息;
打印子單元,用于采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中。
可選的,所述業(yè)務系統(tǒng)的多個層中包括請求入口層和若干個被調(diào)用層;
所述請求入口層是所述業(yè)務請求的進入業(yè)務系統(tǒng)的起始層,并可調(diào)用所述被調(diào)用層;所述若干個被調(diào)用層至少部分層與層之間具有調(diào)用順序,按照調(diào)用順序依次被上一層所調(diào)用;
所述日志打印組件確定單元是在所述請求入口層進行的。
可選的,所述日志打印組件獲取子單元包括:
調(diào)用子單元,用于將業(yè)務請求的請求參數(shù)作為接口參數(shù),根據(jù)所述調(diào)用順序依次調(diào)用不同層的業(yè)務系統(tǒng)中的層;
獲取子單元,用于不同層分別根據(jù)所述業(yè)務請求的類型確定與該業(yè)務請求所對應的日志打印組件。
可選的,該裝置還包括:
業(yè)務請求結(jié)果返回單元,用于在所述采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中之后,按照調(diào)用順序的反順序依次返回業(yè)務請求的結(jié)果;
結(jié)果返回請求方單元,用于被請求入口層調(diào)用的被調(diào)用層將業(yè)務請求的結(jié)果返回至請求入口層之后,所述請求入口層將業(yè)務請求的結(jié)果返回給請求方。
可選的,所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息中的日志信息還包括額外業(yè)務請求信息,所述額外業(yè)務請求信息是指請求方發(fā)送的額外業(yè)務請求所對應的指定的所需要打印的信息;
所述日志信息打印單元包括:
額外請求獲取子單元,用于在包含有所述額外業(yè)務請求的層,確定該額外業(yè)務請求對應的日志打印組件;
指定信息獲取子單元,用于獲取所述額外請求業(yè)務對應的額外請求參數(shù)及返回的所需要打印的指定信息;
指定信息打印子單元,用于采用確定的所述日志打印組件將獲取的額外請求參數(shù)及返回的指定信息打印到與該額外業(yè)務請求所對應的日志文件中。
可選的,所述日志打印組件確定單元包括:
類型獲取子單元,用于獲取業(yè)務請求所對應的類型;
打印子單元,用于基于所述業(yè)務請求所對應的類型,采用預設方式設置該業(yè)務請求的接口方法以使得業(yè)務請求與相應的日志打印組件之間具有對應關系。
可選的,該裝置還包括:
日志攔截方式設置單元,用于采用預先設置的分層攔截方式為每層設置日志攔截方式;
日志打印任務執(zhí)行單元,用于在所述接收業(yè)務請求之后,不同層均采用所述日志攔截方式分別攔截相應層的業(yè)務請求,以執(zhí)行相應業(yè)務請求的日志打印任務。
本申請另外還提供一種日志打印系統(tǒng),該系統(tǒng)包括:
自動攔截器模塊,用于攔截業(yè)務請求,并采用預設方式將日志攔截器配置到業(yè)務系統(tǒng)的各個層的接口上;
業(yè)務信息配置模塊,用于接收自動攔截器模塊攔截的業(yè)務請求,并基于業(yè)務請求,為業(yè)務請求配置以確定與該業(yè)務請求所對應的日志打印組件;
日志打印工具模塊,用于在自動攔截器模塊攔截到業(yè)務請求之后,采用業(yè)務信息配置模塊配置的日志打印組件在業(yè)務系統(tǒng)中打印日志。
可選的,所述業(yè)務信息配置模塊將配置好的日志打印組件與業(yè)務請求的對應關系存儲在用于維護該對應關系的線程上;
相應的,所述日志打印工具模塊從所述線程上獲取日志打印組件與業(yè)務請求的對應關系,并采用該日志打印組件將相應的業(yè)務請求的操作所產(chǎn)生的日志信息打印到相應的日志文件中。
與現(xiàn)有技術相比,本申請具有以下優(yōu)點:
本申請?zhí)峁┮环N日志打印方法,應用于業(yè)務系統(tǒng)中,所述業(yè)務系統(tǒng)包括多個層,該方法包括:接收業(yè)務請求;根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件;將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中。
該方法是建立一個簡單、靈活、對業(yè)務代碼無侵入的日志框架的方法,無需業(yè)務系統(tǒng)增加代碼,當不同業(yè)務的請求過來,該方法建立的日志框架會自動將每一層處理方法的參數(shù)及返回值打印在不同業(yè)務對應的日志文件中,同時業(yè)務代碼中的日志打印也可以直接打印到該業(yè)務對應的日志文件中,可以保證一次業(yè)務請求鏈路上的所有日志都能夠打印到一個文件中。
附圖說明
圖1是本申請第一實施例提供的日志打印方法的流程圖。
圖2是本申請第一實施例提供的日志打印組件打印日志過程的流程圖
圖3是本申請第一實施例提供的服務層接受業(yè)務請求時的時序的狀態(tài)圖。
圖4是本申請第一實施例提供的領域?qū)咏邮芊諏訕I(yè)務調(diào)用的時序的狀態(tài)圖。
圖5是本申請第一實施例提供的使用日志打印組件打印日志的時序的狀態(tài)圖。
圖6是本申請第二實施例提供的日志打印裝置的結(jié)構(gòu)示意圖。
圖7是本申請第三實施例提供的日志打印系統(tǒng)的結(jié)構(gòu)示意圖。
圖8是本申請第四實施例提供的電子設備的結(jié)構(gòu)示意圖。
具體實施方式
本申請第一實施例提供一種日志打印方法,該方法應用于業(yè)務系統(tǒng)中,所述業(yè)務系統(tǒng)包括多個層,具體的,通過該方法可以在業(yè)務系統(tǒng)中構(gòu)建用于打印日志的日志框架,該日志框架可以預先為業(yè)務請求配置相應的日志打印工具,從而使得多層構(gòu)架的業(yè)務系統(tǒng)的各層的日志信息均可以打印到一個日志文件中,相應的,針對一個業(yè)務請求,該業(yè)務請求鏈路的日志將串寫在一個日志文件中,因此,可以在通過日志文件進行排查問題或進行業(yè)務監(jiān)控時節(jié)省耗費時間和精力。另一方面,在保證上述一個業(yè)務請求鏈路的日志打印至一個文件的同時,該方法不需要在業(yè)務系統(tǒng)中增加代碼,以方便程序開發(fā)人員專注于業(yè)務代碼的開發(fā),無需另外考慮與日志相關的各種問題。
以下通過具體的實施例對該方法進行說明和介紹。圖1是本申請第一實施例提供的日志打印方法的流程圖。請參照圖1,該方法包括以下步驟S101-步驟S103。
步驟S101,接收業(yè)務請求。
在服務端的業(yè)務系統(tǒng)中,一般會劃分出不同的層次來進行代碼的隔離和抽象,因此,一個簡單的后端業(yè)務系統(tǒng)可以由多個具有分層構(gòu)架的多個分層構(gòu)成,例如,該分層可以包括請求入口層和若干個被調(diào)用層,所述請求入口層是所述業(yè)務請求的進入所述業(yè)務系統(tǒng)的最上層,該最上層可以直接接收該業(yè)務請求該請求入口層也是進入該業(yè)務系統(tǒng)的起始層,并可調(diào)用所述被調(diào)用層;所述若干個被調(diào)用層至少部分層與層之間具有調(diào)用順序,按照調(diào)用順序,依次可以被上一層所調(diào)用。
常用的該分層構(gòu)架可以包括服務層、領域?qū)雍蛿?shù)據(jù)層等,或者是表示層,業(yè)務層,數(shù)據(jù)層等,也可以包括通訊層、邏輯層、數(shù)據(jù)層等。總之,業(yè)務系統(tǒng)是可以通過包含多層的方式實現(xiàn)業(yè)務的完整執(zhí)行,在業(yè)務系統(tǒng)的每一層中分別執(zhí)行該層所需要執(zhí)行的任務。其中,常用的業(yè)務系統(tǒng)可以包括服務層、領域?qū)雍蛿?shù)據(jù)層,通過該三個層可執(zhí)行不同的業(yè)務請求。所述服務層可以設定為請求入口層,用于直接接收外部業(yè)務請求,另外,層與層之間采用調(diào)用的方式連接,則相應的,服務層可以調(diào)用領域?qū)?,而領域?qū)涌梢哉{(diào)用數(shù)據(jù)層。上述調(diào)用關系即為該業(yè)務系統(tǒng)中各層之間的調(diào)用順序。
由于服務層、領域?qū)雍蛿?shù)據(jù)層是業(yè)務系統(tǒng)常用的分層方式,本實施例將以該分層方式為例進行說明。業(yè)務請求方通過前端系統(tǒng)發(fā)出業(yè)務請求信號,相應的,該業(yè)務請求信息需要經(jīng)過后端業(yè)務系統(tǒng)的上述三個層進行處理,并且針對一個業(yè)務請求,該業(yè)務請求在每個層均可以將該業(yè)務請求所需要的日志信息打印在相應的日志文件中。
通過上述介紹,說明在服務端的業(yè)務系統(tǒng)中,每一層都可能接收業(yè)務請求,而根據(jù)層與層之間的調(diào)用順序,可以獲知,所述服務層可以接收業(yè)務請求,并可以以該業(yè)務請求的請求參數(shù)作為傳遞參數(shù)繼續(xù)調(diào)用所述領域?qū)?,同樣的,所述領域?qū)右部梢愿鶕?jù)傳遞參數(shù)調(diào)用所述數(shù)據(jù)層。
每執(zhí)行一次業(yè)務請求,在相應的服務層、領域?qū)雍蛿?shù)據(jù)層均有相應的操作在執(zhí)行,該操作所產(chǎn)生的信息即為后續(xù)需要打印的日志信息。
所述業(yè)務請求可以是請求方發(fā)起的在登陸界面上登陸的過程,或者在注冊界面上進行注冊的過程等,或者在付款界面上進行付款的過程等,該業(yè)務請求的具體類型可以有多種,只要是請求方發(fā)起的請求,均可以將該請求分為不同的類。
另外,為了保證該日志打印的任務被執(zhí)行,需要設置開啟該日志打印任務的方式,只有執(zhí)行該開啟操作之后,才會將接收的業(yè)務請求進行日志打印,而該開啟操作可以通過多種方式實現(xiàn),優(yōu)選的,采用日志攔截器攔截業(yè)務請求的方式實現(xiàn)上述開啟操作。
具體的,需要預先采用預設方式為不同層設置日志攔截方式。
由于每層中具體執(zhí)行的業(yè)務請求所執(zhí)行的操作是不同的,相應的,每層執(zhí)行的操作所產(chǎn)生的日志信息也是不相同的,因此,需要以層為基準,分別獲取不同的每層的日志信息,這樣則每層均需要執(zhí)行針對業(yè)務請求的日志打印任務,因此,在每層的入口位置,均需要設置相應的日志攔截器,以攔截調(diào)用該相應層的業(yè)務請求。
所述預先采用預設方式為每層設置日志攔截方式的步驟中的所述預設方式包括:面向切面方式,該面向切面方式可以是AOP(Aspect Oriented Programming),以下可以將AOP作為面向切面方式替代名詞。具體的,所述AOP是通過預編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術。AOP是OOP的延續(xù),是軟件開發(fā)中的一個熱點,也是Spring框架中的一個重要內(nèi)容,是函數(shù)式編程的一種衍生的范型。利用AOP可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。
此處,采用AOP方式可以將業(yè)務系統(tǒng)中各層進行隔離,以將日志攔截器設置到各個層次的入口位置的接口方法上。
相應的,在每層的接口方法上設置有日志攔截器,并且在所述接收業(yè)務請求之后,可以執(zhí)行以下操作:
采用所述日志攔截方式攔截所述業(yè)務請求,執(zhí)行相應業(yè)務請求的日志打印任務。
該步驟是通過日志攔截方式攔截每層的業(yè)務請求,攔截之后可以執(zhí)行相應業(yè)務請求的日志打印任務,具體該日志打印任務是如何執(zhí)行的,可通過后續(xù)步驟進行介紹和說明。
請繼續(xù)參照圖1,步驟S102,根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件。
其中,該日志打印組件用于將日志信息打印在對應該日志打印組件的日志文件中。
該步驟是具體是根據(jù)業(yè)務請求的種類或類型,為不同類型的業(yè)務請求配置不同的日志打印組件的過程,上述步驟中簡單的對所述業(yè)務請求進行了簡單的說明和介紹。
例如,針對用戶登陸這一請求,可以將用戶登陸這一過程作為一個類,并且為該類的業(yè)務請求確定相應的日志打印組件,而日志打印組件是打印日志的一個工具,通過日志打印組件可以將需要打印的日志信息打印至相應的日志文件中,因此,日志打印組件是與日志文件對應的。
相應的,根據(jù)業(yè)務請求的類型,可以將相同類型的業(yè)務請求所產(chǎn)生的日志信息打印至相同的日志文件中,并且,每層中均可以執(zhí)行日志打印的任務,且可以將每層中登陸這一請求所涉及的操作產(chǎn)生的日志信息打印至同一日志文件中,每一層的日志信息可以采用串寫的方式打印在同一日志文件中。
具體的,所述基于所述業(yè)務請求的類型,為所述業(yè)務請求確定對應的日志打印組件步驟所采用的方式包括:獲取業(yè)務請求的類型。
首先獲取業(yè)務請求的類型,以使得可以根據(jù)業(yè)務請求的類型來確定相應的日志打印組件。
基于所述業(yè)務請求所對應的類型,采用預設方式設置該業(yè)務請求的接口方法以使得業(yè)務請求與相應的日志打印組件相對應。
所述預設方式包括:采用注解的方式;或者,采用xml配置方式。所述采用注解的方式,是在業(yè)務請求的接口方法上增加相應的日志打印組件的注解,以使業(yè)務請求的接口方法與對應的日志打印組件之間具有對應關系。
上述預設方式并是受限于上述兩種方式,其他可以將接口方法與日志打印組件進行對應的方式均屬于本申請保護的范圍。
根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件這一步驟一般是在請求入口層完成的,只有在最上層的請求入口層配置好相應的日志打印組件之后,才可能在后續(xù)步驟中采用該配置好的日志打印組件進行日志的打印任務。
另外,該基于所述業(yè)務請求的類型,為所述業(yè)務請求確定對應的日志打印組件步驟可以在封裝的業(yè)務信息配置模塊中完成,該業(yè)務信息配置模塊的作用即是采用預設的方式將請求入口的業(yè)務接口方法和實際的日志文件對應起來。
具體的,所述根據(jù)所述業(yè)務請求,確定對應層以及對應的日志打印組件之后,可以執(zhí)行以下操作:
存儲所述日志打印組件以及該日志打印組件與對應的業(yè)務請求之間的對應關系。
該步驟是將日志打印組件以日志打印組件與相應的業(yè)務請求的對應關系存儲起來的過程,由于后續(xù)步驟中還會應用到該日志打印組件,并且也涉及到日志打印組件與相應的業(yè)務請求之間的對應關系,所以,需要在此將上述信息進行存儲,以供后續(xù)步驟進行上述信息的獲取。
在本申請第一實施例中,針對將所述存儲所述日志打印組件以及該日志打印組件與對應的業(yè)務請求之間的對應關系存儲中,其中存儲方式可以包括多種,其中優(yōu)選的存儲方式包括以下方式:
將所述日志打印組件以及該日志打印組件與對應的業(yè)務請求之間的對應關系存儲在線程本地變量中。
所述線程本地變量可稱為ThreadLocal,在該ThreadLocal中可以存儲上述日志打印組件以及日志打印組件與相應類型的業(yè)務請求之間的對應關系。存儲在所述ThreadLocal中之后,在業(yè)務系統(tǒng)的每個層次中,均可以從相應層次中的所述ThreadLocal中獲取相應的日志打印組件,因此,針對相同的業(yè)務請求,每層中均可以從該ThreadLocal中讀取與該業(yè)務請求相對應的日志打印組件,并采用該日志打印組件將每層中的日志信息可以打印至相同的日志文件中。
相應的,所述在分層構(gòu)架的業(yè)務系統(tǒng)的所有層中,將所述業(yè)務請求所產(chǎn)生的需要記錄的日志信息,采用與該業(yè)務請求相對應的日志打印組件打印到相應的日志文件中步驟,圖2是本申請第一實施例提供的日志打印組件打印日志過程的流程圖,請參照圖2,該過程包括以下步驟S102-1至步驟S102-3:
步驟S102-1,在分層構(gòu)架的業(yè)務系統(tǒng)的每一層中,根據(jù)所述業(yè)務請求的類型獲取與該業(yè)務請求對應的日志打印組件。
由于上述步驟中已經(jīng)將日志打印組件存儲在所述線程本地變量中,相應的,所述在分層構(gòu)架的業(yè)務系統(tǒng)的每一層中,根據(jù)所述業(yè)務請求的類型獲取與該業(yè)務請求對應的日志打印組件,是每一層均從所述線程本地變量中獲取所述業(yè)務請求所對應的日志打印組件。
另外,針對相同的業(yè)務請求,每層中均可以從該線程本地變量(ThreadLocal)中讀取與該業(yè)務請求相對應的日志打印組件,并采用該日志打印組件將每層中的日志信息打印至相同的日志文件中。
具體的,所述在分層構(gòu)架的業(yè)務系統(tǒng)的每一層中,根據(jù)所述業(yè)務請求的類型獲取與該業(yè)務請求對應的日志打印組件步驟包括:
為所述請求入口層及若干個被調(diào)用層設置調(diào)用順序。
所述請求入口層可以調(diào)用第一個被調(diào)用層,第一個被調(diào)用層可以調(diào)用第二個被調(diào)用層,依次類推,設置請求入口層及若干個被調(diào)用層之間的調(diào)用順序。其中,所述請求入口層直接接收的是外部的請求方的調(diào)用。
具體的,所述業(yè)務系統(tǒng)的多個層中包括請求入口層和若干個被調(diào)用層;所述請求入口層是所述業(yè)務請求的進入業(yè)務系統(tǒng)的起始層,并可調(diào)用所述被調(diào)用層;所述若干個被調(diào)用層至少部分層與層之間具有調(diào)用順序,按照調(diào)用順序依次被上一層所調(diào)用。
其次,為所述請求入口層及若干個被調(diào)用層設置調(diào)用順序之后,將業(yè)務請求的請求參數(shù)作為接口參數(shù),根據(jù)所述調(diào)用順序依次調(diào)用不同層的業(yè)務系統(tǒng)中的層。
每個層次中的入口位置設置有接口方法,將請求參數(shù)作為接口參數(shù),通過每個層入口位置的接口方法進行參數(shù)的傳遞和調(diào)用,以連接所有層。
不同層分別根據(jù)所述業(yè)務請求的類型獲取與該業(yè)務請求所對應的日志打印組件。在該步驟之后,執(zhí)行以下操作:
按照調(diào)用順序的反順序依次返回業(yè)務請求的結(jié)果。被請求入口層調(diào)用的被調(diào)用層將業(yè)務請求的結(jié)果返回至請求入口層之后,所述請求入口層將業(yè)務請求的結(jié)果返回給請求方。
請繼續(xù)參照圖2,步驟S102-2,獲取不同層中的業(yè)務請求所產(chǎn)生的需要記錄的日志信息。
該步驟是獲取每層中日志信息的過程,針對每一個業(yè)務請求,該業(yè)務請求在業(yè)務系統(tǒng)中的每一層執(zhí)行的操作是不同的,相應的,每層中執(zhí)行的操作所產(chǎn)生的信息稱為日志信息,因此,根據(jù)每一層的不同操作,將會形成不同的日志信息。
具體的,例如,登陸這一請求,根據(jù)每層的作用不同,則每層所執(zhí)行的操作也不同,例如,針對服務層、領域?qū)雍蛿?shù)據(jù)層,在服務層可能執(zhí)行的是將用戶登陸的用戶名作為請求參數(shù),判定系統(tǒng)中是否有該用戶名存在。而在領域?qū)涌赡軋?zhí)行的是將請求參數(shù)對應的請求對象轉(zhuǎn)變?yōu)橄到y(tǒng)中的內(nèi)部對象,其不再顯示用戶名,而是通過轉(zhuǎn)變成的內(nèi)部對象對請求參數(shù)進行判斷。在數(shù)據(jù)層可能執(zhí)行的是對用戶密碼的判斷過程,其執(zhí)行的操作就是密碼的判斷。所以,針對一個登陸請求,服務層、領域?qū)雍蛿?shù)據(jù)層所執(zhí)行的操作是不同的,相應的,執(zhí)行操作所產(chǎn)生的日志信息也是不同的,但所有層的日志信息均是涉及登陸這一請求的。
上述兩個步驟已經(jīng)獲取了相應的日志打印組件以及每層與業(yè)務請求相關的日志信息,下述步驟即使通過日志打印組件進行日志打印的過程。
請繼續(xù)參照圖2,步驟S102-3,采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中。
該步驟是在上述兩個步驟的基礎上完成的,所述日志打印組件是與業(yè)務請求的類型對應的,相同類型的業(yè)務請求將對應一個日志打印組件,則該日志打印組件將每層中獲取的該類型的業(yè)務請求所產(chǎn)生的日志信息打印到同一個日志文件中。
由于所述分層構(gòu)架的業(yè)務系統(tǒng)包括請求入口層和若干個被調(diào)用層;所述請求入口層是所述業(yè)務請求的進入所述業(yè)務系統(tǒng)的最上層;所述若干個被調(diào)用層用于按照調(diào)用順序,依次被上一層所調(diào)用。
相應的,所述基于所述業(yè)務請求的類型,為所述業(yè)務請求確定對應的日志打印組件步驟,是在所述請求入口層,基于所述業(yè)務請求的類型,為所述業(yè)務請求確定對應的日志打印組件。
需要說明的是,所述業(yè)務請求所產(chǎn)生的需要記錄的日志信息步驟中的日志信息采用以下方式獲?。?/p>
所述分層構(gòu)架的業(yè)務系統(tǒng)中每一層根據(jù)接收到的業(yè)務請求的請求參數(shù)進行相應層的業(yè)務調(diào)用,每層可獲取與請求參數(shù)對應的返回結(jié)果;將所述請求參數(shù)與返回結(jié)果作為所述日志信息。
也就是,針對正常的業(yè)務調(diào)用所涉及的日志信息包括請求參數(shù)和返回結(jié)果,并且最終將該請求參數(shù)和返回結(jié)果打印至相應的日志文件中即可。
另外,除了上述正常的業(yè)務調(diào)用,還涉及額外的業(yè)務調(diào)用,因此,所述業(yè)務請求所產(chǎn)生的需要記錄的日志信息步驟中的日志信息還包括額外業(yè)務請求信息,所述額外業(yè)務請求信息是指請求方發(fā)送的額外業(yè)務請求所對應的指定的所需要打印的信息。
相應的,在涉及所述額外業(yè)務請求的相應層,獲取額外業(yè)務請求對應的日志打印組件;獲取所述額外請求業(yè)務對應的額外請求參數(shù)及返回的所需要打印的指定信息;采用所述日志打印組件將獲取的額外請求參數(shù)及返回的指定信息打印到相應的日志文件中。
上述步驟中已經(jīng)獲取了日志打印組件,并且該日志打印組件與業(yè)務請求的類型是相互對應的,因此,后續(xù)步驟是通過該日志打印組件對獲取的日志信息進行打印的過程。
請繼續(xù)參照圖1,步驟S103,將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中。
在步驟S102中已經(jīng)介紹過,可以基于所述業(yè)務請求的類型,為所述業(yè)務請求確定對應的日志打印組件之后,在線程本地變量中將上述日志打印組件以及該日志打印組件與對應的業(yè)務請求之間的對應關系進行存儲,后續(xù)步驟中可以從所述線程本地變量中獲取相應的日志打印組件。
具體的,該步驟是采用以下步驟實現(xiàn)的:
在分層構(gòu)架的業(yè)務系統(tǒng)的不同層中,根據(jù)所述業(yè)務請求的類型確定與該業(yè)務請求對應的日志打印組件。
由于所述分層構(gòu)架的業(yè)務系統(tǒng)包括請求入口層和若干個被調(diào)用層。所述請求入口層是所述業(yè)務請求的進入所述業(yè)務系統(tǒng)的最上層;所述若干個被調(diào)用層用于按照調(diào)用順序,依次被上一層所調(diào)用。從而依據(jù)調(diào)用順序使每層中均可以調(diào)用獲取與業(yè)務請求所對應的日志打印組件。
進而,獲取不同層中的業(yè)務請求所產(chǎn)生的需要記錄的日志信息。
需要說明的是,所述業(yè)務請求所產(chǎn)生的需要記錄的日志信息步驟中的日志信息采用以下方式獲?。?/p>
所述分層構(gòu)架的業(yè)務系統(tǒng)中每一層根據(jù)接收到的業(yè)務請求的請求參數(shù)進行相應層的業(yè)務調(diào)用,每層可獲取與請求參數(shù)對應的返回結(jié)果;將所述請求參數(shù)與返回結(jié)果作為所述日志信息。
另外,需要說明的是,由于在業(yè)務系統(tǒng)包括的多層中涉及各層之間的調(diào)用順序,因此,所述采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中時,該日志文件中的日志信息的排列也可以具有順序,具體的,該排列順序可以是根據(jù)業(yè)務系統(tǒng)中多層之間的調(diào)用順序進行排列的,相應的,可以根據(jù)所述調(diào)用順序,確定打印到日志文件中的日志信息的順序。
也就是,針對正常的業(yè)務調(diào)用所涉及的日志信息包括請求參數(shù)和返回結(jié)果,并且最終將該請求參數(shù)和返回結(jié)果打印至相應的日志文件中即可。
另外,除了上述正常的業(yè)務調(diào)用,還涉及額外的業(yè)務調(diào)用,因此,所述業(yè)務請求所產(chǎn)生的需要記錄的日志信息步驟中的日志信息還包括額外業(yè)務請求信息,所述額外業(yè)務請求信息是指請求方發(fā)送的額外業(yè)務請求所對應的指定的所需要打印的信息。
相應的,所述將所述業(yè)務請求所產(chǎn)生的需要記錄的日志信息,采用與該業(yè)務請求相對應的日志打印組件打印到相應的日志文件中步驟包括:
在涉及所述額外業(yè)務請求的相應層,獲取額外業(yè)務請求對應的日志打印組件;獲取所述額外請求業(yè)務對應的額外請求參數(shù)及返回的所需要打印的指定信息;采用所述日志打印組件將獲取的額外請求參數(shù)及返回的指定信息打印到相應的日志文件中。
針對每一個業(yè)務請求,該業(yè)務請求在業(yè)務系統(tǒng)中的每一層執(zhí)行的操作是不同的,相應的,每層中執(zhí)行的操作所產(chǎn)生的信息稱為日志信息,因此,根據(jù)每一層的不同操作,將會形成不同的日志信息。
具體的,例如,登陸這一請求,根據(jù)每層的作用不同,則每層所執(zhí)行的操作也不同,例如,針對服務層、領域?qū)雍蛿?shù)據(jù)層,在服務層可能執(zhí)行的是將用戶登陸的用戶名作為請求參數(shù),判定系統(tǒng)中是否有該用戶名存在。而在領域?qū)涌赡軋?zhí)行的是將請求參數(shù)對應的請求對象轉(zhuǎn)變?yōu)橄到y(tǒng)中的內(nèi)部對象,其不再顯示用戶名,而是通過轉(zhuǎn)變成的內(nèi)部對象對請求參數(shù)進行判斷。在數(shù)據(jù)層可能執(zhí)行的是對用戶密碼的判斷過程,其執(zhí)行的操作就是密碼的判斷。所以,針對一個登陸請求,服務層、領域?qū)雍蛿?shù)據(jù)層所執(zhí)行的操作是不同的,相應的,執(zhí)行操作所產(chǎn)生的日志信息也是不同的,但所有層的日志信息均是涉及登陸這一請求的。
之后,采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中。
如果業(yè)務類型相同,則在不同層中獲得的日志打印組件是相同的,相應的,采用該相同的日志打印組件將每層中的日志信息打印到的日志文件也是相同的。
此外,在執(zhí)行完日志打印任務之后,需要將此次業(yè)務請求的結(jié)果返回給請求方,該具體的返回方式如下:
在所采用獲取的日志打印組件將每層的日志信息打印到相同的日志文件中步驟之后,執(zhí)行以下操作:
按照調(diào)用順序的反順序依次返回業(yè)務請求的結(jié)果。
被請求入口層調(diào)用的被調(diào)用層將業(yè)務請求的結(jié)果返回至請求入口層之后,所述請求入口層將業(yè)務請求的結(jié)果返回給請求方。
為了方便理解,本申請第一實施例通過具體的事例對上述方法進行說明,圖3是本申請第一實施例提供的服務層接受業(yè)務請求時的時序的狀態(tài)圖。圖4是本申請第一實施例提供的領域?qū)咏邮芊諏訕I(yè)務調(diào)用的時序的狀態(tài)圖。圖5是本申請第一實施例提供的使用日志打印組件打印日志的時序的狀態(tài)圖。
圖3是針對服務層接受業(yè)務請求的時序,請參照圖3,該服務層是業(yè)務系統(tǒng)的外部調(diào)用的請求入口層,在該服務層中,首先通過服務層入口位置設置的日志攔截器攔截業(yè)務請求,攔截該業(yè)務請求之后,將會執(zhí)行針對該次業(yè)務請求進行日志打印的任務。具體該日志打印任務首先是通過對服務層的接口方法的設置確定該業(yè)務請求對應的日志打印組件(logger),并且將確定的該logger返回至日志攔截器,同時,將該獲取到的logger放置到線程本地變量(ThreadLocal)中,并返回。之后可以向服務層的業(yè)務代碼位置發(fā)送正常業(yè)務的請求,并將正常業(yè)務的結(jié)果進行返回,之后再采用logger打印本次業(yè)務請求的參數(shù)和返回的結(jié)果,最終向請求方返回此次業(yè)務請求的結(jié)果。
圖4是針對領域?qū)咏邮芊諏訕I(yè)務調(diào)用的時序,請參照圖4,該數(shù)據(jù)層接收服務層的調(diào)用后,首先領域?qū)拥娜罩緮r截器將會攔截該請求,并從ThreadLocal中獲取當前業(yè)務請求對應的logger,并返回,之后再向領域?qū)訕I(yè)務代碼發(fā)送正常業(yè)務的調(diào)用,返回該正常業(yè)務調(diào)用的結(jié)果,然后使用獲得的logger打印領域?qū)拥恼埱蟮娜雲(yún)⒑徒Y(jié)果,最后向服務層返回此次業(yè)務的結(jié)果。
而數(shù)據(jù)層接受領域?qū)訕I(yè)務調(diào)用的時序與所述領域?qū)咏邮芊諏拥臉I(yè)務調(diào)用的時序是相類似的,此處不再贅述。
圖5是針對正常業(yè)務的調(diào)用及打印的過程,請參照圖5,首先向日志打印工具模塊發(fā)起打印日志調(diào)用參數(shù),傳送要打印的信息,之后從ThreadLocal中獲取當前業(yè)務請求對應的logger,并返回,然后使用獲得的logger打印傳入的日志信息,最終此次打印的結(jié)果。
總之,當日志攔截器在請求入口攔截到業(yè)務請求之后,根據(jù)調(diào)用的接口方法從業(yè)務信息配置模塊獲取到該業(yè)務請求對應的日志打印組件,然后將該日志打印組件放置到ThreadLocal中。后續(xù)層次攔截器在攔截到調(diào)用后,都從ThreadLocal中獲取到當前業(yè)務的logger,然后采用該獲取到的logger進行日志打印。
因此,該方法可以將一次業(yè)務請求的日志打印在一個文件中,線上排查問題和監(jiān)控對于一個業(yè)務只需要關注一個日志文件,減少了干擾,同時增強了監(jiān)控系統(tǒng)的性能。另外,本方法還可以通過預設方式打印每個層次的請求參數(shù)和返回結(jié)果,無需顯示傳遞logger,因此,對業(yè)務代碼無侵入性,配置使用簡單,能夠使開發(fā)人員專注于業(yè)務代碼,無需額外關系日志的打印。
本申請第二實施例提供一種日志打印裝置,圖6是本申請第二實施例提供的日志打印裝置的結(jié)構(gòu)示意圖,請參照圖6,該裝置包括:
業(yè)務請求接收單元601,用于接收業(yè)務請求;
日志打印組件確定單元602,用于根據(jù)所述業(yè)務請求,確定對應的層以及對應的日志打印組件;
日志信息打印單元603,用于將所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中。
可選的,該裝置還包括:
存儲單元,用于在所述根據(jù)所述業(yè)務請求,確定對應層以及對應的日志打印組件之后,存儲所述日志打印組件以及該日志打印組件與對應的業(yè)務請求之間的對應關系;
所述日志信息打印單元包括:
日志打印組件獲取子單元,用于在業(yè)務系統(tǒng)的不同層中,根據(jù)所述業(yè)務請求的類型確定該業(yè)務請求所對應的日志打印組件;
日志信息獲取子單元,用于獲取不同層中的業(yè)務請求所產(chǎn)生的需要記錄的日志信息;
打印子單元,用于采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中。
可選的,所述業(yè)務系統(tǒng)的多個層中包括請求入口層和若干個被調(diào)用層;
所述請求入口層是所述業(yè)務請求的進入業(yè)務系統(tǒng)的起始層,并可調(diào)用所述被調(diào)用層;所述若干個被調(diào)用層至少部分層與層之間具有調(diào)用順序,按照調(diào)用順序依次被上一層所調(diào)用;
所述日志打印組件確定單元是在所述請求入口層進行的。
可選的,所述日志打印組件獲取子單元包括:
調(diào)用子單元,用于將業(yè)務請求的請求參數(shù)作為接口參數(shù),根據(jù)所述調(diào)用順序依次調(diào)用不同層的業(yè)務系統(tǒng)的層;
獲取子單元,用于不同層分別根據(jù)所述業(yè)務請求的類型確定與該業(yè)務請求所對應的日志打印組件。
可選的,該裝置還包括:
業(yè)務請求結(jié)果返回單元,用于在所述采用確定的日志打印組件將不同層的日志信息打印到所述業(yè)務請求對應的日志文件中,按照調(diào)用順序的反順序依次返回業(yè)務請求的結(jié)果;
結(jié)果返回請求方單元,用于被請求入口層調(diào)用的被調(diào)用層將業(yè)務請求的結(jié)果返回至請求入口層之后,所述請求入口層將業(yè)務請求的結(jié)果返回給請求方。
可選的,所述業(yè)務請求在對應的層中所產(chǎn)生的日志信息中的日志信息還包括額外業(yè)務請求信息,所述額外業(yè)務請求信息是指請求方發(fā)送的額外業(yè)務請求所對應的指定的所需要打印的信息;
所述日志信息打印單元包括:
額外請求獲取子單元,用于在包含有所述額外業(yè)務請求的層,確定額外業(yè)務請求對應的日志打印組件;
指定信息獲取子單元,用于獲取所述額外請求業(yè)務對應的額外請求參數(shù)及返回的所需要打印的指定信息;
指定信息打印子單元,用于采用確定的所述日志打印組件將獲取的額外請求參數(shù)及返回的指定信息打印到與該額外業(yè)務請求所對應的日志文件中。
可選的,所述日志打印組件確定單元包括:
類型獲取子單元,用于獲取業(yè)務請求的所對應類型;
打印子單元,用于基于所述業(yè)務請求的所對應類型,采用預設方式設置該業(yè)務請求的接口方法以使得業(yè)務請求與相應的日志打印組件之間具有對應關系。
可選的,還包括:
日志攔截方式設置單元,用于預先采用預設方式為每層設置日志攔截方式;
日志打印任務執(zhí)行單元,用于在所述接收業(yè)務請求之后,不同層均采用所述日志攔截方式分別攔截相應層的業(yè)務請求,以執(zhí)行相應業(yè)務請求的日志打印任務。
本申請第三實施例還提供一種日志打印系統(tǒng),圖7是本申請第三實施例提供的日志打印系統(tǒng)的結(jié)構(gòu)示意圖,請參照圖7,該系統(tǒng)包括:
自動攔截器模塊701,用于攔截業(yè)務請求,并采用預設方式將日志攔截器配置到業(yè)務系統(tǒng)的各個層的接口上;
業(yè)務信息配置模塊702,用于接收自動攔截器模塊攔截的業(yè)務請求,并基于業(yè)務請求,為業(yè)務請求配置以確定與該業(yè)務請求所對應的日志打印組件;
日志打印工具模塊703,用于在自動攔截器模塊攔截到業(yè)務請求之后,采用業(yè)務信息配置模塊配置的日志打印組件在業(yè)務系統(tǒng)中打印日志。
可選的,所述自動攔截器模塊是通過面向切面的方式設置于所述業(yè)務系統(tǒng)的各個層的接口上的。
可選的,所述業(yè)務信息配置模塊將配置好的日志打印組件與業(yè)務請求的對應關系存儲在用于維護該對應關系的線程上;
相應的,所述日志打印工具模塊從所述線程上獲取日志打印組件與業(yè)務請求的對應關系,并采用該日志打印組件將相應的業(yè)務請求的操作所產(chǎn)生的日志信息打印到相應的日志文件中。
具體的,所述業(yè)務信息配置模塊設置于請求入口層中,該業(yè)務信息配置模塊支持使用注解和xml配置方式,將業(yè)務的接口方法和日志文件對應起來。優(yōu)選的,可以使用注解方式,該注解方式只需在業(yè)務接口方法上加上日志文件的注解即可。
所述攔截器業(yè)務系統(tǒng)的請求入口攔截到請求后,根據(jù)調(diào)用的接口方法從業(yè)務信息配置模塊獲取到業(yè)務對應的日志logger,然后將logger放置到threadlocal中。后續(xù)層次攔截器在攔截到調(diào)用后都從threadlocal中獲取到當前業(yè)務的logger,然后使用這個logger打印日志。
所述日志打印工具模塊無需顯式傳遞logger,在打印日志的時候會從threadlocal中獲取到當前業(yè)務的logger,然后使用這個logger打印日志。并且,當業(yè)務系統(tǒng)有額外的業(yè)務打印需求時,也可以使用日志打印工具模塊在業(yè)務系統(tǒng)中打印日志。
本申請第四實施例提供一種電子設備,圖8是本申請第四實施例提供的電子設備的結(jié)構(gòu)示意圖,請參照圖8,該電子設備包括:
顯示器801;
處理器802;
存儲器803;用于存儲日志打印的程序,該設備通電并運行該日志打印的程序后,執(zhí)行下述步驟:接收業(yè)務請求;根據(jù)所述業(yè)務請求,確定對應層以及對應的日志打印組件;將所述業(yè)務請求在對應層的中所產(chǎn)生的日志信息,采用所述確定的日志打印組件打印到日志文件中,其中,該方法應用于業(yè)務系統(tǒng)中,所述業(yè)務系統(tǒng)包括多個層。
本申請雖然以較佳實施例公開如上,但其并不是用來限定本申請,任何本領域技術人員在不脫離本申請的精神和范圍內(nèi),都可以做出可能的變動和修改,因此本申請的保護范圍應當以本申請權利要求所界定的范圍為準。
在一個典型的配置中,計算設備包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡接口和內(nèi)存。內(nèi)存可能包括計算機可讀介質(zhì)中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內(nèi)存是計算機可讀介質(zhì)的示例。
計算機可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機存取存儲器(SRAM)、動態(tài)隨機存取存儲器(DRAM)、其他類型的隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內(nèi)存技術、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號和載波。
本領域技術人員應明白,本申請的實施例可提供為方法、系統(tǒng)或計算機程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學存儲器等)上實施的計算機程序產(chǎn)品的形式。