远程调试(查看web的打印日志,服务等的打印日志)的一个小工具
写了个远程调用的小工具,分享下 。
有时写程序时候,会在代码中加一些打印的语句,将中间结果打印出来,以便查看正确性与否 ,但当这一部分代码上传到服务器的时候,随之的打印结果也在相应的服务机器上,有没有一种方法,将自己中间打印的东西全部打印到一个特定的地方,无论代码在哪里运行 ??? RMI ,原理很简单:在自己的机器上启动个RMI的服务,然后打印语句时调用这个RMI,将这些语句打印到特定的机器(或文件中,只要你查看方便即可) 。
示例代码如下
RMI服务端:
远程调用的接口RemoteInterface
package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
*
* @author cctv
*
*/
public interface RemoteInterface extends Remote{
/**
* 将信息输出到RMI的服务上 。
* @param outStr 待输出的信息 。
* @param name 待输出的 标志名称
* @throws RemoteException
*/
public void newPrint(String outStr ,String name)throws RemoteException;
}
远程调用接口的实现RemoteInterfaceImpl
package rmi;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class RemoteInterfaceImpl extends UnicastRemoteObject implements RemoteInterface {
protected RemoteInterfaceImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
/**
*
*/
private static final long serialVersionUID = 1L;
//存储服务启动时,待输出的流
private static Map<String,PrintStream> outMap=new HashMap<String,PrintStream>();
//输出的时间格式
private static SimpleDateFormat simpleDateFormat=new SimpleDateFormat("MM月dd日:HH-mm-ss-SS");
@Override
public void newPrint(String outStr, String name) throws RemoteException {
PrintStream out=outMap.get(name);
if(out==null){
try {
out=new PrintStream(new FileOutputStream("out/"+name+".log",true),false,"GBK");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException("创建输出错误!!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException("创建输出错误!!");
}
outMap.put(name, out);
}
System.out.println(simpleDateFormat.format(new Date())+":"+outStr);
out.println(simpleDateFormat.format(new Date())+":"+outStr);
}
}
启动服务的代码main方法
package rmi;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class RmiServer {
private static final int PORT = 52519;
public static void main(String[] args) {
try {
RemoteInterfaceImpl impl = new RemoteInterfaceImpl();
LocateRegistry.createRegistry(PORT);
//设置为本机的的ip ,在别的地方调用该服务的时候,ip和端口号必须和这里一致
Naming.rebind("//127.0.0.1:"+PORT+"/OTU_RMI", impl);
System.out.println("RMI的测试程序!!!!");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
调用端的:
调用时的工具类
package rmi;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 客服端的一个调用工具
* @author cctv
*
*/
public class ClientUtil {
static RemoteInterface client=null;
static{
try {
client = (RemoteInterface) Naming.lookup("//127.0.0.1:52519/OTU_RMI");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//封装的接口,便于客服端调用
public static void println(String outStr, String name){
try {
client.newPrint(outStr, name);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*调用的接口,和util写到一个java文件中,便于调用 。
* @author cctv
*
*/
interface RemoteInterface extends Remote{
/**
* 将信息输出到RMI的服务上 。
* @param outStr 待输出的信息 。
* @param name 待输出的 标志名称
* @throws RemoteException
*/
public void newPrint(String outStr ,String name)throws RemoteException;
}
调用举例
ClientUtil.println("hahahahahhahaha", "测试工程");
并没有太大的技术含量,但使用起来有时挺方便的 。 ~ ~