Skip to main content
Formatting, grammar, reworked title to be more interesting.
Source Link

is this Alter centralized logging code to be thread safe?

I am using this code for receiving log messages from my clients I. I receive more than 1000 connections perper minute. and I want to increase my log handling., which I didhave done with java threading. I have a doubt

What happens if it receive multiple client connection what happens.connections? Is this thread safe? Can you give your suggestions. It will help to improve this code.

is this thread safe?

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.

Alter centralized logging code to be thread safe

I am using this code for receiving log messages from my clients. I receive more than 1000 connections per minute and I want to increase my log handling, which I have done with java threading.

What happens if it receive multiple client connections? Is this thread safe?

added 68 characters in body
Source Link
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 Thread(new LogWriter(server.accept())).start();
            } 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]));
            new Thread(logServer).start();
        } 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) {
        }
    }
}
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) {
        }
    }
}
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 Thread(new LogWriter(server.accept())).start();
            } 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]));
            new Thread(logServer).start();
        } 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) {
        }
    }
}
Tweeted twitter.com/#!/StackCodeReview/status/205572716634443776
Source Link

is this thread safe?

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) {
        }
    }
}