2010.8.25 Log4j SocketAppender & SocketServer 配置心得
今天弄了一天远程log的配置,因为文档和攻略的缺失,调试弄的异常艰难。网上搜的东西,大多只是贴代码,完全不讲原理。最后终于配成
功了,现在把过程整理如下。
概述:基于Socket的远程log由server端和client端组成,server端需要启动一个JAVA类org.apache.log4j.net.SocketServer,client端使用
SocketAppender。
Client端:
Client端其实就是写logger的应用,配置分为两部分,Appender和Logger,当然是写在log4j.xml里了。
Appender:
<appender name="remoteFile" class="org.apache.log4j.net.SocketAppender">
<param name="remoteHost" value="localhost" /><!-- 这是远程log server -->
<param name="port" value="4560" /><!-- 这是远程log server port -->
<param name="Threshold" value="INFO" /><!-- log 级别 -->
<param name="ReconnectionDelay" value="1000" />
<param name="LocationInfo" value="true" />
</appender>
配置看名字也一目了然了。
Logger的配置与普通Logger没任何区别。例:
<logger name="testRemote" additivity="false">
<level value="INFO" />
<appender-ref ref="remoteFile" />
</logger>
写了一段小代码测试Logger。
public class TestLog4j {
public static void main(String[] args) {
DOMConfigurator.configure(TestLog4j.class.getResource("/log4j.xml"));
Logger remoteLogger = LogManager.getLogger("testRemote");
remoteLogger.info("blabla");
}
}
Server端:
Server端使用SocketServer类。这个类提供了main函数,直接运行就可以了,不过需要注意参数的使用:
以下是一个运行的例子:
java -cp log4j-1.2.16.jar org.apache.log4j.net.SocketServer 4560 /data/log4j/log4jserver.properties /data/log4j/lcf/
4560是监听的端口,貌似SocketAppender默认也是这个端口。/data/log4j/log4jserver.properties是配置文件的地址,这个可以随便
改。/data/log4j/lcf/依然是配置文件的地址,不过是以文件夹的形式。操蛋的是,这个文件夹下面随便写个配置文件它是不会读的!现在只知道
generic.lcf会读,其它类似1.lcf之类的文件都会被跳过去。
下面介绍配置文件的写法。
配置文件依然分为Appender和Logger。其实配置方法跟client差不多,只是换成了非xml的写法罢了。
log4jserver.properties:
log4j.rootCategory=INFO, globalfile //logger
log4j.logger.org.apache.log4j.net.SocketServer=DEBUG,serverFile //logger
log4j.additivity.org.apache.log4j.net.SocketServer=false //logger
log4j.appender.serverFile=org.apache.log4j.DailyRollingFileAppender //appender
log4j.appender.serverFile.DatePattern='.'yyyy-MM-dd-HH //appender
log4j.appender.serverFile.encoding=UTF-8 //appender
log4j.appender.serverFile.File=/data/log4j/logs/log4jserver.log //appender
log4j.appender.serverFile.layout=org.apache.log4j.PatternLayout //appender
log4j.appender.serverFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n //appender
log4j.appender.globalfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.globalfile.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.globalfile.encoding=UTF-8
log4j.appender.globalfile.File=/data/log4j/logs/global.log
log4j.appender.globalfile.layout=org.apache.log4j.PatternLayout
log4j.appender.globalfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n
其中上面的logger和appender都标出来了。
最后要说明的是Server和Client的对应关系。Server端和Client端通过Logger来对应,与两边Appender取什么名字无关。Client端的Logger是
什么名字,那么这个logger输出的log最终会被Server端相应的Logger输出。
generic.lcf:
log4j.logger.testRemote=INFO,localFile
log4j.additivity.testRemote=false
log4j.appender.localFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.localFile.DatePattern='.'yyyy-MM-dd
log4j.appender.localFile.encoding=UTF-8
log4j.appender.localFile.File=/data/log4j/logs/localFile.log
log4j.appender.localFile.layout=org.apache.log4j.PatternLayout
log4j.appender.localFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}, %p %m %n
如果没有配log4j.rootCategory,那么Server运行时会提示:
log4j:WARN No appenders could be found for logger (org.apache.log4j.net.SocketNode).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4j:WARN No appenders could be found for logger (testRemote2).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
其实它只写了个:
2011-08-25 21:00:46,Caught java.io.EOFException closing conneciton。这个提示很坑爹,让我一直以为是传过来的logger找不到
appender。
今天弄了一天远程log的配置,因为文档和攻略的缺失,调试弄的异常艰难。网上搜的东西,大多只是贴代码,完全不讲原理。最后终于配成
功了,现在把过程整理如下。
概述:基于Socket的远程log由server端和client端组成,server端需要启动一个JAVA类org.apache.log4j.net.SocketServer,client端使用
SocketAppender。
Client端:
Client端其实就是写logger的应用,配置分为两部分,Appender和Logger,当然是写在log4j.xml里了。
Appender:
<appender name="remoteFile" class="org.apache.log4j.net.SocketAppender">
<param name="remoteHost" value="localhost" /><!-- 这是远程log server -->
<param name="port" value="4560" /><!-- 这是远程log server port -->
<param name="Threshold" value="INFO" /><!-- log 级别 -->
<param name="ReconnectionDelay" value="1000" />
<param name="LocationInfo" value="true" />
</appender>
配置看名字也一目了然了。
Logger的配置与普通Logger没任何区别。例:
<logger name="testRemote" additivity="false">
<level value="INFO" />
<appender-ref ref="remoteFile" />
</logger>
写了一段小代码测试Logger。
public class TestLog4j {
public static void main(String[] args) {
DOMConfigurator.configure(TestLog4j.class.getResource("/log4j.xml"));
Logger remoteLogger = LogManager.getLogger("testRemote");
remoteLogger.info("blabla");
}
}
Server端:
Server端使用SocketServer类。这个类提供了main函数,直接运行就可以了,不过需要注意参数的使用:
以下是一个运行的例子:
java -cp log4j-1.2.16.jar org.apache.log4j.net.SocketServer 4560 /data/log4j/log4jserver.properties /data/log4j/lcf/
4560是监听的端口,貌似SocketAppender默认也是这个端口。/data/log4j/log4jserver.properties是配置文件的地址,这个可以随便
改。/data/log4j/lcf/依然是配置文件的地址,不过是以文件夹的形式。操蛋的是,这个文件夹下面随便写个配置文件它是不会读的!现在只知道
generic.lcf会读,其它类似1.lcf之类的文件都会被跳过去。
下面介绍配置文件的写法。
配置文件依然分为Appender和Logger。其实配置方法跟client差不多,只是换成了非xml的写法罢了。
log4jserver.properties:
log4j.rootCategory=INFO, globalfile //logger
log4j.logger.org.apache.log4j.net.SocketServer=DEBUG,serverFile //logger
log4j.additivity.org.apache.log4j.net.SocketServer=false //logger
log4j.appender.serverFile=org.apache.log4j.DailyRollingFileAppender //appender
log4j.appender.serverFile.DatePattern='.'yyyy-MM-dd-HH //appender
log4j.appender.serverFile.encoding=UTF-8 //appender
log4j.appender.serverFile.File=/data/log4j/logs/log4jserver.log //appender
log4j.appender.serverFile.layout=org.apache.log4j.PatternLayout //appender
log4j.appender.serverFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n //appender
log4j.appender.globalfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.globalfile.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.globalfile.encoding=UTF-8
log4j.appender.globalfile.File=/data/log4j/logs/global.log
log4j.appender.globalfile.layout=org.apache.log4j.PatternLayout
log4j.appender.globalfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n
其中上面的logger和appender都标出来了。
最后要说明的是Server和Client的对应关系。Server端和Client端通过Logger来对应,与两边Appender取什么名字无关。Client端的Logger是
什么名字,那么这个logger输出的log最终会被Server端相应的Logger输出。
generic.lcf:
log4j.logger.testRemote=INFO,localFile
log4j.additivity.testRemote=false
log4j.appender.localFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.localFile.DatePattern='.'yyyy-MM-dd
log4j.appender.localFile.encoding=UTF-8
log4j.appender.localFile.File=/data/log4j/logs/localFile.log
log4j.appender.localFile.layout=org.apache.log4j.PatternLayout
log4j.appender.localFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}, %p %m %n
如果没有配log4j.rootCategory,那么Server运行时会提示:
log4j:WARN No appenders could be found for logger (org.apache.log4j.net.SocketNode).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4j:WARN No appenders could be found for logger (testRemote2).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
其实它只写了个:
2011-08-25 21:00:46,Caught java.io.EOFException closing conneciton。这个提示很坑爹,让我一直以为是传过来的logger找不到
appender。