I am using this code for receiving log messages from my clients I receive more than 1000 connections per minute. I want to increase my log handling. I did with java threading. I have a doubt if it receive multiple client connection what happens. Is this thread safe? Can you give your suggestions. It will help to improve this code.
public class CentralizedLogging implements Runnable {
/**
* Field logDir - Where the plugin logs can be stored .
*/
public static String logDir;
/**
* Field server - Server Socket .
*/
ServerSocket server = null;
/**
* Field LOGGER.
*/
public static final Logger LOGGER = Logger.getLogger(CentralizedLogging.class.getName());
/**
* @param port - Port which the server is binds .
* @param logDir String
*/
public CentralizedLogging(String logDir , int port){
try {
this.logDir = logDir;
server = new ServerSocket(port);
} catch (IOException e) {
LOGGER.log(Level.SEVERE,"It may be due to given port already binds with another process , reason {0}",new Object[]{e});
}
}
/**
* Extension point for central log server . To start receiving connections from remote end .
*/
public void run(){
while(true){
try{
new LogWriter(server.accept());
}catch (Exception e) {
LogWriter.log("Interrupted exception " + e.getMessage());
}
}
}
/**
* args[0] - logging location .
* args[1] - which port the server can start. It must be a integer.
* @param args
*/
public static void main(String[] args) {
try{
CentralizedLogging logServer = new CentralizedLogging(args[0], Integer.parseInt(args[1]));
}catch(Exception e){
LOGGER.log(Level.SEVERE,"Unable to start log server from this location : {0} , port : {1} , This may be due to given port is not a number or this port is not free exception trace {2}", new Object[]{args[0],args[1],e});
}
}
}
/**
* Used for writing client packets into logs Dir .
*/
class LogWriter implements Runnable{
/**
* Field client - Socket Client .
*/
Socket client;
/**
* Constructor for LogWriter.
* @param client Socket
* @throws IOException
*/
public LogWriter(Socket client) {
this.client = client;
}
public void run(){
write();
try{
this.client.close();
}catch(IOException io){
System.out.println("Error while closing connection , reason "+io);
}
}
/**
* Method write.
*/
public void write(){
try{
String date = new SimpleDateFormat("yyyy_MM_dd").format(new Date());
File file = new File(CentralizedLogging.logDir+client.getInetAddress().getHostName() + "_"+ date+".log");
write(client.getInputStream(),file);
}catch(Exception e){
log("Error in writing logs :: Host Name "+client.getInetAddress().getHostName() +" , Occured Time "+System.currentTimeMillis()+", Reason "+e.getMessage()+"\n\n");
}
}
/**
* Method write.
* @param in InputStream
* @param file File
* @throws Exception
*/
public synchronized static void write(InputStream in , File file) throws Exception{
RandomAccessFile writer = new RandomAccessFile(file, "rw");
writer.seek(file.length()); //append the file content to the existing file or creates a new one .
writer.write(read(in));
writer.close();
}
/**
* This method is used for monitoring errors that will be occured on writing plugin logs .
* @param msg
*/
public static void log(String msg){
File file = new File(CentralizedLogging.logDir+"plugin_error_"+new SimpleDateFormat("yyyy_MM_dd").format(new Date())+".log");
try {
write(new ByteArrayInputStream(msg.getBytes()),file);
} catch (Exception e) {
}
}
/**
* Method read.
* @param in InputStream
* @return byte[]
* @throws IOException
*/
public static byte[] read(InputStream in) throws IOException{
ByteArrayOutputStream out = new ByteArrayOutputStream();
int read = -1;
byte[] buffer = new byte[1024];
while((read = in.read(buffer)) > -1){
out.write(buffer,0,read);
}
return out.toByteArray();
}
/**
* Method close.
* @param stream Object
*/
public static void close(Object stream){
try{
if(stream instanceof Writer){
((Writer)stream).close();
}else if(stream instanceof Reader){
((Reader)stream).close();
}
}catch (Exception e) {
}
}
}
No comments:
Post a Comment