最近項(xiàng)目要用到日志服務(wù)器,需要把所有服務(wù)器的日志統(tǒng)一存入一個(gè)日志文件服務(wù)器中,于是就想到了Log4j的SocketAppender。 網(wǎng)上一通搜索,終于找到了相關(guān)的只言片語(yǔ),內(nèi)容幾乎雷同,和examples\lf5\UsingSocketAppenders中提供的例子沒(méi)有什么區(qū)別! 只好自己研究了! 1.基本使用 1.1服務(wù)器 這個(gè)日志服務(wù)器的服務(wù)器端需要運(yùn)行: log4j jar包中的org.apache.log4j.net.SocketServer 加參數(shù) 【本地監(jiān)聽(tīng)端口】【配置文件】【客戶端配置文件目錄】 第三個(gè)參數(shù)【配置文件目錄】其實(shí)指的是針對(duì)每個(gè)客戶端的配置文件,等會(huì)詳細(xì)講!現(xiàn)在用“.”就可以了. 服務(wù)器端的配置文件可以用這個(gè)(引自利用Log4j 創(chuàng)建日志服務(wù)器 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是啟動(dòng)Lf5的log監(jiān)視終端,A3限制大小的文件,A4是日期滾動(dòng)文件。 單A3,A4是講所有客戶端的日志都存放到了同一個(gè)日志文件中,我覺(jué)的這種方法并不好。 1.2客戶端 客戶端的配置文件是這樣的: log4j.rootCategory=,SOCKET log4j.addivity.org.apache=true #應(yīng)用于socket log4j.appender.SOCKET=org.apache.log4j.net.SocketAppender log4j.appender.SOCKET.RemoteHost=localhost #服務(wù)器的IP地址 log4j.appender.SOCKET.Port=1978 #服務(wù)器的監(jiān)聽(tīng)端口 log4j.appender.SOCKET.LocationInfo=true #這個(gè)是什么我不知道 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 啟動(dòng)服務(wù)器端,再運(yùn)行客戶端就可以了!但所有的服務(wù)器端/客戶端的日志都放到了一個(gè)日志文件中! 2.稍微高級(jí)點(diǎn)的使用 下面講如何把各個(gè)客戶端和服務(wù)器端的日志分別放到不同的日志文件中. 這個(gè)我在網(wǎng)上找了好久也沒(méi)有找到! 2.1服務(wù)器 服務(wù)器的配置文件不用怎么改動(dòng),如果你不需要在同一個(gè)文件中存放所有日志,可以把配置文件第一行的A3去掉。 但服務(wù)器端有個(gè)更大的麻煩:代碼有問(wèn)題!問(wèn)題夠大了吧,不知道算不算是個(gè)bug(我用的是1.2.11版log4j)。 改吧! 打開(kāi)log4j目錄下的src\java\org\apache\log4j\net\SocketServer.java 在這段中改動(dòng)(看下面代碼第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 { //這個(gè)是什么意思,專門取"/"符號(hào)嗎?明顯是錯(cuò)的!閉掉 // 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(); } } } 編譯文件! 打開(kāi)log4j目錄下的src\java\org\apache\log4j\net\SocketNode.java (改這段是因?yàn)槲矣玫臅r(shí)候出錯(cuò)!看不出來(lái)改不改有什么區(qū)別) 改第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; 編譯文件! 現(xiàn)在為每個(gè)配置客戶端編配置文件,把配置文件放到【客戶端配置文件目錄】中: log4j.rootCategory=,A4 log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender log4j.appender.A4.file=127.0.0.1.log #為每個(gè)客戶端取不同的名字 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 客戶端 客戶端不用改變,太幸運(yùn)了!! ok啦! 啟動(dòng)服務(wù)器,啟動(dòng)客戶端,現(xiàn)在服務(wù)器的日志放到了server.log中,有配置文件的客戶端的日志會(huì)放到相應(yīng)的日志文件中,沒(méi)有配置文件的客戶端的日志依然放在server.log中! SocketServer.java 和 SocketNode.java兩個(gè)文件可以單獨(dú)做一個(gè)工程,把他們的package去掉就行了! | |