Showing posts with label logging. Show all posts
Showing posts with label logging. Show all posts

Saturday, 28 June 2014

Use SocketAppender to write log on other machine

In this tutorial I will explain how can we write log from one system to other system,
For this purpose I will use SocketAppender of Log4j.For more info regard SocketAppender you can go through this link
https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SocketAppender.html

For Demonstration I will use two log4j configuration file and two java class
one for client machine(localHost) and other for server or remote machine


=========  client log configuration File (client.xml)=========


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="socket" class="org.apache.log4j.net.SocketAppender">
  <param name="Port" value="1342"/>
  <param name="RemoteHost" value="192.000.000.00"/>
  <param name="ReconnectionDelay" value="5000"/>
  <param name="LocationInfo" value="true"/>
  </appender>
 <root>
    <param name="level" value="INFO"/>
    <appender-ref ref="socket" />
  </root>

</log4j:configuration>

class = The SocketAppender class
RemoteHost =  Ip of that machine where you want to write your log
Port = port number of Remote machine

=========  Server log configuration File (server.xml)=========

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender name="rolling" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file"   value="C:/Test/LogFile.log" />
        <param name="datePattern" value="'.'yyyy-MM-dd-HH " />
        <param name="append" value="true" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n"/>
        </layout>
    </appender>
<root> 
    <param name="level" value="INFO"/>
    <appender-ref ref="rolling" /> 
  </root>
</log4j:configuration>

Class = you can use any log4j class as per your requirement I am using  DailyRollingFileAppender.


========= Client Java class =========

package com.amit.blog.clientlogging;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.xml.DOMConfigurator;

/**
 * This class use to logging on remote server on xml defined port.
*/
public class Client
{
    private static Log logger = LogFactory.getLog(Client.class);
    public static void main(String[] a)
    {
      try
      {
        DOMConfigurator.configure("client.xml");
         for(int i=0;i<10;i++)
          {
              logger.info("writing on remote server !");      
          }
      }
       catch (Exception e)
       {
           logger.info("Failed to write on remote server");
       }
    }
}


========= Server Java class =========

package com.amit.blog.serverlogging;

import org.apache.log4j.net.SimpleSocketServer;
/**
 * This class use to receive the log entries from client on port open by method.
 */

public class Server
{
  public static void main(String[] args)
  {
    try
       {
        String defaultPort="1342"; //Need to mention one port to open for writing

         /** This class is provided by log4j
         * It takes two parameters, namely the port to start the
         * server on and the server side log4j configuration file.
         */
        String[] arguments = {defaultPort, "server.xml"};
        SimpleSocketServer.main(arguments);
       }
       catch (Exception ex)
        {
          System.out.println(ex.getMessage());
        }
   }
}



I think It will help you to manage your log.