www.pudn.com > 33_online_store.rar > DebugLog.java


import java.io.*;
import java.net.*;
import LogServer;

public class DebugLog extends Object
{
	private Socket server;
	private String serverName;
	private BufferedReader serverReader;
	
	private PrintWriter log;
	
	private static DebugLog sharedLog;
	
	public static synchronized DebugLog getSharedLog()
	{
	    if(sharedLog == null) sharedLog = new DebugLog();
	    return sharedLog;
	}
	
	public DebugLog()
	{
		log = null;
	}
	
	public synchronized boolean initialized()
	{
	    return ((log != null)||(serverName!=null));
	}
	
	public synchronized void log(String str)
	{
		if((log != null)||(serverName!=null))//exit quick if no log
		{
		    log(str,true);//retry
	    }
	}
	
	public synchronized void log(Exception exp)
	{
		if((log != null)||(serverName!=null))//exit quick if no log
		{
		    StringWriter out;
		    PrintWriter printOut;
		    String logTrace;
		    StringReader in;
		    BufferedReader bufIn;
		    String curLine;
		    
		    try
		    {
    		    out = new StringWriter();
    		    printOut = new PrintWriter(out);
		    
    		    exp.printStackTrace(printOut);
    		    printOut.close();
		    
    		    logTrace = out.toString();
		    
    		    in = new StringReader(logTrace);
    		    bufIn = new BufferedReader(in);
		    
    		    while((curLine = bufIn.readLine()) != null)
    		    {
    		        log(curLine,true);
    	        }
	        
    	        bufIn.close();
	        }
	        catch(Exception ex)
	        {
	        }
	    }
	}
	
	//protected method that allows the logger to reconnect
	//to a server
	protected synchronized void log(String str,boolean retry)
	{
	    boolean error=false;
	    
	    if(log != null)//exit quick if no log
		{
		    try
		    {
    	        log.println(str);
			    
			    if(serverReader != null)
			    {
			        //Read the response, but ignore
			        //This should force an exception
			        // if the socket is closed
			        serverReader.readLine();
			    }
		    }
		    catch(Exception ex)
		    {
		        error = true;
		        closeLog();
		    }
		}
		else
		{
		    error = true;
		}
		
		if((serverName != null) && error)
		{
		    if(retry)
		    {
		        logTo(serverName);
		        log(str,false);//only retry one time
		    }
		    else
		    {
		        closeLog();
		    }
		}
	}
	
	public synchronized void logTo(File f)
	{
	    if(f!=null)
	    {
	        closeLog();
	        
	        try
	        {
    	        FileWriter fileIn = new FileWriter(f.getAbsolutePath(),true);
	            log = new PrintWriter(fileIn,true);
	        }
	        catch(Exception exp)
	        {
	            log = null;
	        }
	    }
	}
	
	public synchronized void logTo(OutputStream stream)
	{
	    if(stream!=null)
	    {
	        closeLog();
	        
	        try
	        {
    	        log = new PrintWriter(stream,true);
	        }
	        catch(Exception exp)
	        {
	            log = null;
	        }
	    }
	}
	
	public synchronized void logTo(String logServer)
	{
	    if(logServer!=null)
	    {
	        closeLog();
    	    
    	    serverName = logServer;
	        
	        try
	        {
	            server = new Socket(logServer,LogServer.DEFAULT_PORT);
    	        
    	        InputStreamReader readIn;
    	        readIn = new InputStreamReader(server.getInputStream());
    	        serverReader = new BufferedReader(readIn);
    	        
    	        log = new PrintWriter(server.getOutputStream(),true);
    	        server.setSoTimeout(2000);//two seconds
	        }
	        catch(Exception exp)
	        {
	            log = null;
	            server = null;
	        }
	    }
	}
	
	public synchronized void closeLog()
	{
	    if((log!=null)&&(server!=null))
	    {
	        try
	        {
	            log.println(LogServer.DISCONNECT_MSG);
	        }
	        catch(Exception exp)
	        {
	        }
	    }
	    
	    if(log != null)
	    {
			log.flush();
	        log.close();
	        log = null;
	    }
	    
	    if(server != null)
	    {
	        try
	        {
	            if(serverReader != null) serverReader.close();
	            server.close();
	            server = null;
	            serverReader = null;
	        }
	        catch(Exception ex)
	        {
	        }
	    }
	}
	
	public synchronized void finalize()
	{
	    closeLog();
	}
}

class DebugLogTester
{
    public static int MSG_COUNT=100;
    
	public static void main(String[] args)
	{
		DebugLog logger = DebugLog.getSharedLog();
		int i;
		
		System.out.println("Created log.");
		logger.logTo("192.168.0.172");
		System.out.println("Set log dest.");
		
		System.out.println("Logging messages.");
		
	    for(i=0;i