lbom

          小江西

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            18 隨筆 :: 21 文章 :: 69 評論 :: 0 Trackbacks

          使用 Log4j 搭建一個日志服務器

          ChinaITLab收集整理 2005-11-24 保存本文 推薦給好友 QQ上看本站 收藏本站


            最近項目要用到日志服務器,需要把所有服務器的日志統一存入一個日志文件服務器中,于是就想到了Log4j的SocketAppender。
            
            網上一通搜索,終于找到了相關的只言片語,內容幾乎雷同,和examples\lf5\UsingSocketAppenders中提供的例子沒有什么區別!
            
            只好自己研究了!
            
            1.基本使用
            
            1.1服務器

            
            這個日志服務器的服務器端需要運行:
            
            log4j jar包中的org.apache.log4j.net.SocketServer
            
            加參數 【本地監聽端口】【配置文件】【客戶端配置文件目錄】
            
            第三個參數【配置文件目錄】其實指的是針對每個客戶端的配置文件,等會詳細講!現在用“.”就可以了.
            
            服務器端的配置文件可以用這個(引自利用Log4j 創建日志服務器 By ?の?):
            
            #文件名socketserver.properties
            #如果需要顯示日志界面,可以將本行啟用
            #log4j.rootCategory=, A1
            log4j.rootLogger=DEBUG,A3
            log4j.category.org.apache.log4j.net=INFO
            
            log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
            log4j.appender.A1.MaxNumberOfRecords=700
            
            log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
            log4j.appender.A4.file=server.log
            log4j.appender.A4.DatePattern='.'yyyyMMdd
            log4j.appender.A4.layout=org.apache.log4j.PatternLayout
            log4j.appender.A4.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
            
            log4j.appender.A3=org.apache.log4j.RollingFileAppender
            log4j.appender.A3.file=server2.log
            log4j.appender.A3.MaxFileSize=1024KB
            log4j.appender.A3.MaxBackupIndex=999
            log4j.appender.A3.layout=org.apache.log4j.PatternLayout
            log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
            
            其中A1是啟動Lf5的log監視終端,A3限制大小的文件,A4是日期滾動文件。
            
            單A3,A4是講所有客戶端的日志都存放到了同一個日志文件中,我覺的這種方法并不好。
            
            1.2客戶端
            
            客戶端的配置文件是這樣的:
            log4j.rootCategory=,SOCKET
            log4j.addivity.org.apache=true
            
            #應用于socket
            log4j.appender.SOCKET=org.apache.log4j.net.SocketAppender
            log4j.appender.SOCKET.RemoteHost=localhost  #服務器的IP地址
            log4j.appender.SOCKET.Port=1978       #服務器的監聽端口
            log4j.appender.SOCKET.LocationInfo=true   #這個是什么我不知道
            log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
            log4j.appender.SOCKET.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%t%m%n
            
            #A2
            log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender
            log4j.appender.A2.file=server.log
            log4j.appender.A2.DatePattern='.'yyyy-MM-dd
            log4j.appender.A2.layout=org.apache.log4j.PatternLayout
            log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
            
            啟動服務器端,再運行客戶端就可以了!但所有的服務器端/客戶端的日志都放到了一個日志文件中!
            
            2.稍微高級點的使用
            
            下面講如何把各個客戶端和服務器端的日志分別放到不同的日志文件中.
            
            這個我在網上找了好久也沒有找到!
            
            2.1服務器
            
            服務器的配置文件不用怎么改動,如果你不需要在同一個文件中存放所有日志,可以把配置文件第一行的A3去掉。
            
            但服務器端有個更大的麻煩:代碼有問題!問題夠大了吧,不知道算不算是個bug(我用的是1.2.11版log4j)。
            
            改吧!
            
            打開log4j目錄下的src\java\org\apache\log4j\net\SocketServer.java
            
            在這段中改動(看下面代碼第12行)
            
            LoggerRepository configureHierarchy(InetAddress inetAddress) {
            cat.info("Locating configuration file for "+inetAddress);
            // We assume that the toSting method of InetAddress returns is in
            // the format hostname/d1.d2.d3.d4 e.g. torino/192.168.1.1
            String s = inetAddress.toString();
            int i = s.indexOf("/");
            if(i == -1) {
            cat.warn("Could not parse the inetAddress ["+inetAddress+
            "]. Using default hierarchy.");
            return genericHierarchy();
            } else {
            //這個是什么意思,專門取"/"符號嗎?明顯是錯的!閉掉
            //  String key = s.substring(0, i);
            //改為
            String key = s.substring(i+1);
            File configFile = new File(dir, key+CONFIG_FILE_EXT);
            if(configFile.exists()) {
            Hierarchy h = new Hierarchy(new RootLogger((Level) Priority.DEBUG));
            hierarchyMap.put(inetAddress, h);
            
            new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h);
            
            return h;
            } else {
            cat.warn("Could not find config file ["+configFile+"].");
            return genericHierarchy();
            }
            }
            }
            
            編譯文件!
            
            打開log4j目錄下的src\java\org\apache\log4j\net\SocketNode.java
            
            (改這段是因為我用的時候出錯!看不出來改不改有什么區別)
            
            改第54行
            
            ois = new ObjectInputStream(
            new BufferedInputStream(socket.getInputStream()));
            
            為
            
            InputStream is = socket.getInputStream();
            if (is != null) {
            ois = new ObjectInputStream(new BufferedInputStream(is));
            }
            
            文件頭加 import java.io.InputStream;
            
            編譯文件!
            
            現在為每個配置客戶端編配置文件,把配置文件放到【客戶端配置文件目錄】中:
            log4j.rootCategory=,A4
            log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender
            log4j.appender.A4.file=127.0.0.1.log  #為每個客戶端取不同的名字
            log4j.appender.A4.DatePattern='.'yyyyMMdd
            log4j.appender.A4.layout=org.apache.log4j.PatternLayout
            log4j.appender.A4.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
            
            保存文件名為[客戶端ip地址].lcf 如192.168.0.126.lcf
            
            2.2 客戶端
            
            客戶端不用改變,太幸運了!!
            
            ok啦!
            
            啟動服務器,啟動客戶端,現在服務器的日志放到了server.log中,有配置文件的客戶端的日志會放到相應的日志文件中,沒有配置文件的客戶端的日志依然放在server.log中!
            
            SocketServer.java 和 SocketNode.java兩個文件可以單獨做一個工程,把他們的package去掉就行了!
          posted on 2005-12-23 11:14 lbom 閱讀(244) 評論(0)  編輯  收藏 所屬分類: 網絡資料
          主站蜘蛛池模板: 乌兰浩特市| 莎车县| 广州市| 仙游县| 宣汉县| 宿松县| 盐亭县| 峨眉山市| 荥阳市| 蒙城县| 全椒县| 惠东县| 茂名市| 扶余县| 西和县| 南郑县| 万安县| 临高县| 本溪| 若羌县| 广东省| 积石山| 西平县| 陕西省| 铜陵市| 苍溪县| 金秀| 扎兰屯市| 莱西市| 台山市| 东阿县| 焦作市| 乌兰县| 喀什市| 巍山| 襄城县| 南陵县| 搜索| 龙陵县| 长垣县| 抚远县|