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(new BufferedInputStream(socket.getInputStream()));
71 } catch (Exception e) {
72 logger.error("Could not open ObjectInputStream to " + socket, e);
73 closed = true;
74 }
75
76 ILoggingEvent event;
77 Logger remoteLogger;
78
79 try {
80 while (!closed) {
81
82 event = (ILoggingEvent) hardenedLoggingEventInputStream.readObject();
83
84
85 remoteLogger = context.getLogger(event.getLoggerName());
86
87 if (remoteLogger.isEnabledFor(event.getLevel())) {
88
89 remoteLogger.callAppenders(event);
90 }
91 }
92 } catch (java.io.EOFException e) {
93 logger.info("Caught java.io.EOFException closing connection.");
94 } catch (java.net.SocketException e) {
95 logger.info("Caught java.net.SocketException closing connection.");
96 } catch (IOException e) {
97 logger.info("Caught java.io.IOException: " + e);
98 logger.info("Closing connection.");
99 } catch (Exception e) {
100 logger.error("Unexpected exception. Closing connection.", e);
101 }
102
103 socketServer.socketNodeClosing(this);
104 close();
105 }
106
107 void close() {
108 if (closed) {
109 return;
110 }
111 closed = true;
112 if (hardenedLoggingEventInputStream != null) {
113 try {
114 hardenedLoggingEventInputStream.close();
115 } catch (IOException e) {
116 logger.warn("Could not close connection.", e);
117 } finally {
118 hardenedLoggingEventInputStream = null;
119 }
120 }
121 }
122
123 @Override
124 public String toString() {
125 return this.getClass().getName() + remoteSocketAddress.toString();
126 }
127 }