空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          使用Log4j搭建一個日志服務器
          agamem 原創   更新:2005-11-22 14:31:17  版本: 1.0   

             最近項目要用到日志服務器,需要把所有服務器的日志統一存入一個日志文件服務器中,于是就想到了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行)
          1. LoggerRepository configureHierarchy(InetAddress inetAddress) {
          2.     cat.info("Locating configuration file for "+inetAddress);
          3.     // We assume that the toSting method of InetAddress returns is in
          4.     // the format hostname/d1.d2.d3.d4 e.g. torino/192.168.1.1
          5.     String s = inetAddress.toString();
          6.     int i = s.indexOf("/");
          7.     if(i == -1) {
          8.       cat.warn("Could not parse the inetAddress ["+inetAddress+
          9.            "]. Using default hierarchy.");
          10.       return genericHierarchy();
          11.     } else {
          12.       //這個是什么意思,專門取"/"符號嗎?明顯是錯的!閉掉
          13. //    String key = s.substring(0, i);
          14.       //改為
          15.     String key = s.substring(i+1);
          16.       File configFile = new File(dir, key+CONFIG_FILE_EXT);
          17.       if(configFile.exists()) {
          18.     Hierarchy h = new Hierarchy(new RootLogger((Level) Priority.DEBUG));
          19.     hierarchyMap.put(inetAddress, h);
          20.     new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h);
          21.     return h;
          22.       } else {
          23.     cat.warn("Could not find config file ["+configFile+"].");
          24.     return genericHierarchy();
          25.       }
          26.     }
          27.   }

          編譯文件!

          打開log4j目錄下的src\java\org\apache\log4j\net\SocketNode.java
          (改這段是因為我用的時候出錯!看不出來改不改有什么區別)
          改第54行
          1.       ois = new ObjectInputStream(
          2.                          new BufferedInputStream(socket.getInputStream()));
          3.    

          1.     InputStream is = socket.getInputStream();
          2.     if (is != null) {
          3.        ois = new ObjectInputStream(new BufferedInputStream(is));
          4.     }

          文件頭加 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去掉就行了!

          下面的工作弄弄lf5!!等我弄好了再發上來!
          bye-bye!
          posted on 2007-10-08 09:24 蘆葦 閱讀(2272) 評論(1)  編輯  收藏

          Feedback

          # re: 使用Log4j搭建一個日志服務器 2013-05-28 15:38 hsyan
          請教一下如何編譯?  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 贞丰县| 彩票| 盐城市| 广安市| 开原市| 南漳县| 芮城县| 来宾市| 通山县| 仲巴县| 剑河县| 黑水县| 普宁市| 江门市| 墨竹工卡县| 沈阳市| 澎湖县| 拜泉县| 长春市| 武陟县| 正镶白旗| 抚顺市| 安宁市| 原阳县| 蕲春县| 明星| 兖州市| 孝义市| 章丘市| 德惠市| 江津市| 博乐市| 鹤岗市| 昭通市| 通化市| 嘉荫县| 公安县| 诸城市| 新蔡县| 江油市| 桂东县|