最后,使用SocketAppender时,在应用程序退出时,最好显示的调用LoggerManager.shutdown()方法,不然如果是通过垃圾回收器来隐式的关闭(finalize()方法)SocketAppender,在Windows平台中可能会存在TCP管道中未传输的数据丢失的情况。另外,在网络连接不可用时,SocketAppender可能会阻塞应用程序,当网络可用,但是远程日志服务器不可用时,相应的日志会被丢失。如果日志传输给远程日志服务器的速度要慢于日志产生速度,此时会影响应用程序性能。这些问题在下一小节的SocketHubAppender中同样存在。
测试代码
可以使用一下代码测试SocketAppender和SocketNode:
1 @Test
2 public void testSocketAppender() throws Exception {
3SocketAppender appender = new SocketAppender(
4InetAddress.getLocalHost(), 8000);
5appender.setLocationInfo(true);
6appender.setApplication("AppenderTest");
7appender.activateOptions();
8configAppender(appender);
9
10Logger log = Logger.getLogger("levin.log4j.test.TestBasic");
11for(int i = 0;i < 100; i++) {
12Thread.sleep(10000);
13if(i % 2 == 0) {
14log.info("Normal test.");
15} else {
16log.info("Exception test", new Exception());
17}
18}
19 }
20
21 @Test
22 public void testSimpleSocketServer() throws Exception {
23ConsoleAppender appender = new ConsoleAppender(new TTCCLayout());
24appender.activateOptions();
25configAppender(appender);
26
27ServerSocket serverSocket = new ServerSocket(8000);
28while(true) {
29Socket socket = serverSocket.accept();
30new Thread(new SocketNode(socket,
31LogManager.getLoggerRepository()),
32"SimpleSocketServer-" + 8000).start();
33}
34 }
SocketHubAppender类
SocketHubAppender类似SocketAppender,它也将日志信息(序列化后的LoggingEvent实例)发送到指定的日志服务器,该日志服务器可以是SocketNode支持的服务器。不同的是,SocketAppender指定日志服务器的地址和端口号,而SocketHubAppender并不直接指定日志服务器的地址和端口号,它自己启动一个指定端口的服务器,由日志服务器注册到到该服务器,从而产生一个连接参数,SocketHubAppender根据这些参数发送日志信息到注册的日志服务器,因而SocketHubAppender支持同时发送相同的日志信息到多个日志服务器。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29497-40.html
北洋没有