1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.classic.net;
15
16 import java.io.BufferedInputStream;
17 import java.io.IOException;
18 import java.net.Socket;
19 import java.net.SocketAddress;
20
21 import ch.qos.logback.classic.Logger;
22 import ch.qos.logback.classic.LoggerContext;
23 import ch.qos.logback.classic.net.server.HardenedLoggingEventInputStream;
24 import ch.qos.logback.classic.spi.ILoggingEvent;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class SocketNode implements Runnable {
43
44 Socket socket;
45 LoggerContext context;
46 HardenedLoggingEventInputStream hardenedLoggingEventInputStream;
47 SocketAddress remoteSocketAddress;
48
49 Logger logger;
50 boolean closed = false;
51 SimpleSocketServer socketServer;
52
53 public SocketNode(SimpleSocketServer socketServer, Socket socket, LoggerContext context) {
54 this.socketServer = socketServer;
55 this.socket = socket;
56 remoteSocketAddress = socket.getRemoteSocketAddress();
57 this.context = context;
58 logger = context.getLogger(SocketNode.class);
59 }
60
61
62
63
64
65
66
67 public void run() {
68
69 try {
70 hardenedLoggingEventInputStream = new HardenedLoggingEventInputStream(
71 new BufferedInputStream(socket.getInputStream()));
72 } catch (Exception e) {
73 logger.error("Could not open ObjectInputStream to " + socket, e);
74 closed = true;
75 }
76
77 ILoggingEvent event;
78 Logger remoteLogger;
79
80 try {
81 while (!closed) {
82
83 event = (ILoggingEvent) hardenedLoggingEventInputStream.readObject();
84
85
86 remoteLogger = context.getLogger(event.getLoggerName());
87
88 if (remoteLogger.isEnabledFor(event.getLevel())) {
89
90 remoteLogger.callAppenders(event);
91 }
92 }
93 } catch (java.io.EOFException e) {
94 logger.info("Caught java.io.EOFException closing connection.");
95 } catch (java.net.SocketException e) {
96 logger.info("Caught java.net.SocketException closing connection.");
97 } catch (IOException e) {
98 logger.info("Caught java.io.IOException: " + e);
99 logger.info("Closing connection.");
100 } catch (Exception e) {
101 logger.error("Unexpected exception. Closing connection.", e);
102 }
103
104 socketServer.socketNodeClosing(this);
105 close();
106 }
107
108 void close() {
109 if (closed) {
110 return;
111 }
112 closed = true;
113 if (hardenedLoggingEventInputStream != null) {
114 try {
115 hardenedLoggingEventInputStream.close();
116 } catch (IOException e) {
117 logger.warn("Could not close connection.", e);
118 } finally {
119 hardenedLoggingEventInputStream = null;
120 }
121 }
122 }
123
124 @Override
125 public String toString() {
126 return this.getClass().getName() + remoteSocketAddress.toString();
127 }
128 }