使用Log4j搭建一個日志服務(wù)器 |
agamem 原創(chuàng) 更新:2005-11-22 14:31:17 版本: 1.0 |
|
最近項目要用到日志服務(wù)器,需要把所有服務(wù)器的日志統(tǒng)一存入一個日志文件服務(wù)器中,于是就想到了Log4j的SocketAppender。
網(wǎng)上一通搜索,終于找到了相關(guān)的只言片語,內(nèi)容幾乎雷同,和examples\lf5\UsingSocketAppenders中提供的例子沒有什么區(qū)別!
只好自己研究了!
1.基本使用
1.1服務(wù)器
這個日志服務(wù)器的服務(wù)器端需要運行:
log4j jar包中的org.apache.log4j.net.SocketServer
加參數(shù) 【本地監(jiān)聽端口】【配置文件】【客戶端配置文件目錄】
第三個參數(shù)【配置文件目錄】其實指的是針對每個客戶端的配置文件,等會詳細講!現(xiàn)在用“.”就可以了.
服務(wù)器端的配置文件可以用這個(引自利用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是啟動Lf5的log監(jiān)視終端,A3限制大小的文件,A4是日期滾動文件。
單A3,A4是講所有客戶端的日志都存放到了同一個日志文件中,我覺的這種方法并不好。
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)聽端口
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
啟動服務(wù)器端,再運行客戶端就可以了!但所有的服務(wù)器端/客戶端的日志都放到了一個日志文件中!
2.稍微高級點的使用
下面講如何把各個客戶端和服務(wù)器端的日志分別放到不同的日志文件中.
這個我在網(wǎng)上找了好久也沒有找到!
2.1服務(wù)器
服務(wù)器的配置文件不用怎么改動,如果你不需要在同一個文件中存放所有日志,可以把配置文件第一行的A3去掉。
但服務(wù)器端有個更大的麻煩:代碼有問題!問題夠大了吧,不知道算不算是個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
(改這段是因為我用的時候出錯!看不出來改不改有什么區(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)在為每個配置客戶端編配置文件,把配置文件放到【客戶端配置文件目錄】中:
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啦!
啟動服務(wù)器,啟動客戶端,現(xiàn)在服務(wù)器的日志放到了server.log中,有配置文件的客戶端的日志會放到相應(yīng)的日志文件中,沒有配置文件的客戶端的日志依然放在server.log中!
SocketServer.java 和 SocketNode.java兩個文件可以單獨做一個工程,把他們的package去掉就行了!
下面的工作弄弄lf5!!等我弄好了再發(fā)上來!
bye-bye!
|
|
|