程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用 Log4j 搭建一個日志服務器

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

編輯:關於JAVA
 最近項目要用到日志服務器

,需要把所有服務器的日志統一存入一個日志文件服務器中,於是就想到了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去掉就行了!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved