Posted on 2006-03-16 16:49
柳隨風(fēng) 閱讀(4984)
評論(1) 編輯 收藏 所屬分類:
開源框架
背景:
一般操作系統(tǒng)級的告警有相關(guān)的軟件,但我們應(yīng)用級日志往往無法統(tǒng)一監(jiān)控、分析。因為最近的項目是比較大的一個平臺,有七、八個子系統(tǒng),weblogic域也有三、四個。如果用戶自身能夠?qū)崟r監(jiān)控到應(yīng)用級致命異常日志 如OutOfMemory,線程掛死、應(yīng)用接口無法鏈接等等。那么我們監(jiān)控維護(hù)人員工作就大大簡化,不然要查看所有域的日志信息,只需集中看一處,系統(tǒng)故障也能夠更快的解決,恢復(fù)正常。
用戶的需求是要求我們將日志輸出到一個第三方廠家的日志Server。
設(shè)想:
weblogic platform域的日志輸出是可配置的,在$bea/weblogic/common/lib/workshopLogCfg.xml, 原先的一個項目所有的日志輸出均在此文件中配置。其他中間件本人很少使用,相信也有類似的功能,log4j日志框架支持統(tǒng)一日志管理功能,簡單實現(xiàn)原理(啟動一個SocketServer,處理各個客戶端機器連接的Socket輸入,
而每個應(yīng)用打印日志使用Socket方式將日志內(nèi)容輸出到SocketServer端)。如果能將重要的的中間件異常日志以及應(yīng)用異常日志到統(tǒng)一日志服務(wù)器,實時分析,這樣就方便日常監(jiān)控,有點類似于設(shè)備告警的功能,如果再開發(fā)出相關(guān)日志分析軟件,個人覺得會是平臺級產(chǎn)品的一個亮點,正如《少林足球》說的有點搞頭。
實踐:
實踐證明現(xiàn)實和理想總歸有一定的差距,呵呵。下面描述驗證、學(xué)習(xí)心得:
首先描述log4j是如何實現(xiàn)統(tǒng)一日志管理該功能的。
核心類:
一、org.apache.log4j.net.SocketServer
主要功能:
1、啟動SocketServer
2、接受Socket請求
3、初始化對應(yīng)Socket的日志輸出配置,如沒有,就采用通用配置
4、另啟線程處理客戶端Socket和服務(wù)端交互
一個比較標(biāo)準(zhǔn)的多線程處理實現(xiàn)。
啟動Server需要有三個運行參數(shù):端口號、log4j配置文件、客戶端日志在Server端輸出配置文件目錄
運行命令如下:
java -classpath ../lib/log4j-1.2.8.jar;.; test.logserver.FixSocketServer 8088 server.properties d:/temp
說明:
a、客戶端日志在Server端輸出配置文件命名規(guī)則 $ip.lcf , 如 10.21.11.10.lcf
該類在解析該配置文件的代碼中 應(yīng)該存在個bug(版本1.2.9)
代碼176 行 String key = s.substring(0,i);改為: String key = s.substring(i+1);
b、配置文件內(nèi)容和一般log4j配置內(nèi)容雷同,categories、appenders、layouts
二、org.apache.log4j.net.SocketAppender
該類繼承于AppenderSkeleton,如果我們需要自定義Appender,可以繼承AppenderSkeleton類,實現(xiàn)方法:
protected void append(LoggingEvent event);
主要功能:
1、連接到SocketServer,并創(chuàng)建一個到SocketServer的對象輸出實例
2、如果連接失敗,會啟動一個守護(hù)線程,每隔三十秒鐘重新連接
3、日志輸出時,將日志事件對象輸出到SocketServer
相對應(yīng)的日志配置:
log4j.appender.mysocket=test.logserver.SocketAppender
log4j.appender.mysocket.RemoteHost=10.243.17.85
log4j.appender.mysocket.Port=8088
log4j.appender.mysocket.LocationInfo=true
log4j.appender.mysocket.layout=org.apache.log4j.PatternLayout
log4j.appender.myConsole.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
三、org.apache.log4j.net.SocketNode
該類相對簡單,一個線程類
主要功能:
負(fù)責(zé)接收客戶端對應(yīng)輸出對象,根據(jù)對應(yīng)的配置,輸出相關(guān)日志。
可以看出是通過對象進(jìn)行傳輸?shù)模绻谌讲皇遣捎胘ava語言的,實際解決時只需改寫SocketAppender的append方法,輸出日志內(nèi)容就可。對方實現(xiàn)SocketServer功能就可(編程語言基本都支持該功能)。
遺憾的是在weblogic 一般server域中我沒有找到可以改變?nèi)罩据敵龅牡胤剑ㄉ洗慰吹絯eblogic9.0中有日志服務(wù),不知道能不能改變),所以實際差距還是比較大的,關(guān)于性能問題,因為是重要的日志(warning、error、fetal)才輸出,采用socket方式問題應(yīng)該不大。
篇外話:
查看代碼中無意中發(fā)現(xiàn)log4j框架一部分源碼都是一些人捐獻(xiàn)的。雖然代碼不復(fù)雜,但感覺為自己喜歡的框架很熱心,希望它變的越來越好,真的希望我們國內(nèi)也能有一些優(yōu)秀的開源項目,并且大家都去支持它,發(fā)展它。
實際我在項目中使用log4j使用的都是一些基本功能,對它的設(shè)計、結(jié)構(gòu)不是很清楚,誰有相關(guān)學(xué)習(xí)文檔,請給我一份,不甚感激(使用手冊已有)。