📄 mysocketappender.java
字号:
/*
* 创建日期 2005-8-16
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
package cn.com.infosec.IDCard.common.util.logger;
import java.net.InetAddress;
import java.net.Socket;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectOutputStream;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.AppenderSkeleton;
final class MySocketAppender extends AppenderSkeleton {
/**
The default port number of remote logging server (4560).
*/
static final int DEFAULT_PORT = 4560;
/**
The default reconnection delay (30000 milliseconds or 30 seconds).
*/
static final int DEFAULT_RECONNECTION_DELAY = 1000;
/**
We remember host name as String in addition to the resolved
InetAddress so that it can be returned via getOption().
*/
String remoteHost;
InetAddress address;
int port = DEFAULT_PORT;
ObjectOutputStream oos;
int reconnectionDelay = DEFAULT_RECONNECTION_DELAY;
boolean locationInfo = false;
boolean netready=true;
private Connector connector;
int counter = 0;
// reset the ObjectOutputStream every 70 calls
//private static final int RESET_FREQUENCY = 70;
private static final int RESET_FREQUENCY = 1;
public MySocketAppender() {
}
/**
Connects to remote server at <code>address</code> and <code>port</code>.
*/
public MySocketAppender(InetAddress address, int port) {
this.address = address;
this.remoteHost = address.getHostName();
this.port = port;
connect(address, port);
}
/**
Connects to remote server at <code>host</code> and <code>port</code>.
*/
public MySocketAppender(String host, int port) {
this.port = port;
this.address = getAddressByName(host);
this.remoteHost = host;
connect(address, port);
}
/**
Connect to the specified <b>RemoteHost</b> and <b>Port</b>.
*/
public void activateOptions() {
System.out.println("beenn1");
connect(address, port);
}
/**
* Close this appender.
*
* <p>This will mark the appender as closed and call then {@link
* #cleanUp} method.
* */
synchronized public void close() {
if(closed)
return;
this.closed = true;
cleanUp();
}
/**
* Drop the connection to the remote host and release the underlying
* connector thread if it has been created
* */
public void cleanUp() {
if(oos != null) {
try {
oos.close();
} catch(IOException e) {
LogLog.error("Could not close oos.", e);
}
oos = null;
}
if(connector != null) {
//LogLog.debug("Interrupting the connector.");
connector.interrupted = true;
connector = null; // allow gc
}
}
void connect(InetAddress address, int port) {
if(this.address == null)
return;
try {
// First, close the previous connection if any.
cleanUp();
oos = new ObjectOutputStream(new Socket(address, port).getOutputStream());
netready=true;
} catch(IOException e) {
netready=false;
String msg = "Could not connect to remote log4j server at ["
+address.getHostName()+"].";
if(reconnectionDelay > 0) {
msg += " We will try again later.";
fireConnector(); // fire the connector thread
}
LogLog.error(msg, e);
}
}
public void append(LoggingEvent event) {
if(event == null)
return;
if(address==null) {
errorHandler.error("No remote host is set for SocketAppender named \""+
this.name+"\".");
return;
}
if(oos != null) {
try {
if(locationInfo) {
event.getLocationInformation();
}
oos.writeObject(event);
//LogLog.debug("=========Flushing.");
oos.flush();
if(++counter >= RESET_FREQUENCY) {
counter = 0;
// Failing to reset the object output stream every now and
// then creates a serious memory leak.
//System.err.println("Doing oos.reset()");
oos.reset();
System.out.println("reset");
}
} catch(IOException e) {
oos = null;
LogLog.warn("Detected problem with connection: "+e);
netready=false;
if(reconnectionDelay > 0) {
fireConnector();
}
}
}
}
void fireConnector() {
if(connector == null) {
LogLog.debug("Starting a new connector thread.");
connector = new Connector();
connector.setDaemon(true);
connector.setPriority(Thread.MIN_PRIORITY);
connector.start();
}
}
static
InetAddress getAddressByName(String host) {
try {
return InetAddress.getByName(host);
} catch(Exception e) {
LogLog.error("Could not find address of ["+host+"].", e);
return null;
}
}
/**
* The SocketAppender does not use a layout. Hence, this method
* returns <code>false</code>.
* */
public boolean requiresLayout() {
return false;
}
/**
* The <b>RemoteHost</b> option takes a string value which should be
* the host name of the server where a {@link SocketNode} is
* running.
* */
public void setRemoteHost(String host) {
address = getAddressByName(host);
remoteHost = host;
}
/**
Returns value of the <b>RemoteHost</b> option.
*/
public String getRemoteHost() {
return remoteHost;
}
/**
The <b>Port</b> option takes a positive integer representing
the port where the server is waiting for connections.
*/
public void setPort(int port) {
this.port = port;
}
/**
Returns value of the <b>Port</b> option.
*/
public int getPort() {
return port;
}
public void setnetready(boolean netready){
this.netready=netready;
}
public boolean getnetready(){
return netready;
}
/**
The <b>LocationInfo</b> option takes a boolean value. If true,
the information sent to the remote host will include location
information. By default no location information is sent to the server.
*/
public void setLocationInfo(boolean locationInfo) {
this.locationInfo = locationInfo;
}
/**
Returns value of the <b>LocationInfo</b> option.
*/
public boolean getLocationInfo() {
return locationInfo;
}
/**
The <b>ReconnectionDelay</b> option takes a positive integer
representing the number of milliseconds to wait between each
failed connection attempt to the server. The default value of
this option is 30000 which corresponds to 30 seconds.
<p>Setting this option to zero turns off reconnection
capability.
*/
public void setReconnectionDelay(int delay) {
this.reconnectionDelay = delay;
}
/**
Returns value of the <b>ReconnectionDelay</b> option.
*/
public int getReconnectionDelay() {
return reconnectionDelay;
}
/**
The Connector will reconnect when the server becomes available
again. It does this by attempting to open a new connection every
<code>reconnectionDelay</code> milliseconds.
<p>It stops trying whenever a connection is established. It will
restart to try reconnect to the server when previpously open
connection is droppped.
@author Ceki Gülcü
@since 0.8.4
*/
class Connector extends Thread {
boolean interrupted = false;
public
void run() {
Socket socket;
while(!interrupted) {
try {
sleep(reconnectionDelay);
LogLog.debug("Attempting connection to "+address.getHostName());
socket = new Socket(address, port);
synchronized(this) {
oos = new ObjectOutputStream(socket.getOutputStream());
netready=true;
connector = null;
LogLog.debug("Connection established. Exiting connector thread.");
break;
}
} catch(InterruptedException e) {
LogLog.debug("Connector interrupted. Leaving loop.");
return;
} catch(java.net.ConnectException e) {
LogLog.debug("Remote host "+address.getHostName()
+" refused connection.");
} catch(IOException e) {
LogLog.debug("Could not connect to " + address.getHostName()+
". Exception is " + e);
}
}
//LogLog.debug("Exiting Connector.run() method.");
}
/**
public
void finalize() {
LogLog.debug("Connector finalize() has been called.");
}
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -