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 }