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