42.error("Detected problem with connection, not reconnecting.",
43e, ErrorCode.GENERIC_FAILURE);
44}
45}
46}
47 }
SocketNode类
Log4J为日志服务器的实现提供了SocketNode类,它接收客户端的链接,并根据配置打印到相关的Appender中。
1 public class SocketNode implements Runnable {
2Socket socket;
3LoggerRepository hierarchy;
4ObjectInputStream ois;
5
6public SocketNode(Socket socket, LoggerRepository hierarchy) {
7this.socket = socket;
8this.hierarchy = hierarchy;
9try {
10ois = new ObjectInputStream(new BufferedInputStream(
11socket.getInputStream()));
12} catch () {
13
14}
15}
16
17public void run() {
18LoggingEvent event;
19Logger remoteLogger;
20try {
21if (ois != null) {
22while (true) {
23event = (LoggingEvent) ois.readObject();
24remoteLogger = hierarchy.getLogger(event.getLoggerName());
25if (event.getLevel().isGreaterOrEqual(
26remoteLogger.getEffectiveLevel())) {
27remoteLogger.callAppenders(event);
28}
29}
30}
31} catch () {
32
33} finally {
34if (ois != null) {
35try {
36ois.close();
37} catch (Exception e) {
38logger.info("Could not close connection.", e);
39}
40}
41if (socket != null) {
42try {
43socket.close();
44} catch (InterruptedIOException e) {
45Thread.currentThread().interrupt();
46} catch (IOException ex) {
47}
48}
49}
50}
51 }
事实上,Log4J提供了两个日志服务器的实现类:SimpleSocketServer和SocketServer。他们都会接收客户端的连接,为每个客户端链接创建一个SocketNode实例,并根据指定的配置文件打印日志消息。它们的不同在于SimpleSocketServer同时支持xml和properties配置文件,而SocketServer只支持properties配置文件;另外,SocketServer支持不同客户端使用不同的配置文件(以客户端主机名作为选择配置文件的方式),而SimpleSocketServer不支持。
最后,使用SocketAppender时,在应用程序退出时,最好显示的调用LoggerManager.shutdown()方法,不然如果是通过垃圾回收器来隐式的关闭(finalize()方法)SocketAppender,在Windows平台中可能会存在TCP管道中未传输的数据丢失的情况。另外,在网络连接不可用时,SocketAppender可能会阻塞应用程序,当网络可用,但是远程日志服务器不可用时,相应的日志会被丢失。如果日志传输给远程日志服务器的速度要慢于日志产生速度,此时会影响应用程序性能。这些问题在下一小节的SocketHubAppender中同样存在。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-29497-19.html
杨洋的Hi-Res初体验##杨洋h
该出手时必须出手