1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.varia;
19
20 import java.io.DataInputStream;
21 import java.io.DataOutputStream;
22 import java.io.IOException;
23 import java.io.InterruptedIOException;
24 import java.net.ServerSocket;
25 import java.net.Socket;
26
27 import org.apache.log4j.RollingFileAppender;
28 import org.apache.log4j.helpers.LogLog;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class ExternallyRolledFileAppender extends RollingFileAppender {
51
52
53
54
55
56 static final public String ROLL_OVER = "RollOver";
57
58
59
60
61
62 static final public String OK = "OK";
63
64 int port = 0;
65 HUP hup;
66
67
68
69
70 public
71 ExternallyRolledFileAppender() {
72 }
73
74
75
76
77
78 public
79 void setPort(int port) {
80 this.port = port;
81 }
82
83
84
85
86 public
87 int getPort() {
88 return port;
89 }
90
91
92
93
94 public
95 void activateOptions() {
96 super.activateOptions();
97 if(port != 0) {
98 if(hup != null) {
99 hup.interrupt();
100 }
101 hup = new HUP(this, port);
102 hup.setDaemon(true);
103 hup.start();
104 }
105 }
106 }
107
108
109 class HUP extends Thread {
110
111 int port;
112 ExternallyRolledFileAppender er;
113
114 HUP(ExternallyRolledFileAppender er, int port) {
115 this.er = er;
116 this.port = port;
117 }
118
119 public
120 void run() {
121 while(!isInterrupted()) {
122 try {
123 ServerSocket serverSocket = new ServerSocket(port);
124 while(true) {
125 Socket socket = serverSocket.accept();
126 LogLog.debug("Connected to client at " + socket.getInetAddress());
127 new Thread(new HUPNode(socket, er), "ExternallyRolledFileAppender-HUP").start();
128 }
129 } catch(InterruptedIOException e) {
130 Thread.currentThread().interrupt();
131 e.printStackTrace();
132 } catch(IOException e) {
133 e.printStackTrace();
134 } catch(RuntimeException e) {
135 e.printStackTrace();
136 }
137 }
138 }
139 }
140
141 class HUPNode implements Runnable {
142
143 Socket socket;
144 DataInputStream dis;
145 DataOutputStream dos;
146 ExternallyRolledFileAppender er;
147
148 public
149 HUPNode(Socket socket, ExternallyRolledFileAppender er) {
150 this.socket = socket;
151 this.er = er;
152 try {
153 dis = new DataInputStream(socket.getInputStream());
154 dos = new DataOutputStream(socket.getOutputStream());
155 } catch(InterruptedIOException e) {
156 Thread.currentThread().interrupt();
157 e.printStackTrace();
158 } catch(IOException e) {
159 e.printStackTrace();
160 } catch(RuntimeException e) {
161 e.printStackTrace();
162 }
163 }
164
165 public void run() {
166 try {
167 String line = dis.readUTF();
168 LogLog.debug("Got external roll over signal.");
169 if(ExternallyRolledFileAppender.ROLL_OVER.equals(line)) {
170 synchronized(er) {
171 er.rollOver();
172 }
173 dos.writeUTF(ExternallyRolledFileAppender.OK);
174 }
175 else {
176 dos.writeUTF("Expecting [RollOver] string.");
177 }
178 dos.close();
179 } catch(InterruptedIOException e) {
180 Thread.currentThread().interrupt();
181 LogLog.error("Unexpected exception. Exiting HUPNode.", e);
182 } catch(IOException e) {
183 LogLog.error("Unexpected exception. Exiting HUPNode.", e);
184 } catch(RuntimeException e) {
185 LogLog.error("Unexpected exception. Exiting HUPNode.", e);
186 }
187 }
188 }
189