和把Log寫入文件的原因相同:http://blog.csdn.net/wyzxk888/article/details/7478152
就是因爲Android開發過程中會出現手機offline,爲了達到更加實時的查看日誌信息,可以使用Java提供的Socket相關類,通過不斷的發送UDP包達到效果。
手機端同樣是一個單例類,用於發送日誌消息:
package org.test;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LogSender {
private static LogSender mLogSender;
private static DatagramSocket socket;
private static InetAddress serverAddress;
private static int port;
private static SimpleDateFormat df;
private LogSender(String host, int por) throws SocketException, UnknownHostException {
socket = new DatagramSocket();
port = por;
serverAddress = InetAddress.getByName(host);
}
public static LogSender create(String host, int port) throws SocketException, UnknownHostException {
if (mLogSender == null) {
mLogSender = new LogSender(host, port);
}
df = new SimpleDateFormat("[yy-MM-dd hh:mm:ss]: ");
return mLogSender;
}
public void close() {
socket.close();
}
public void print(String log) throws IOException {
log = df.format(new Date()) + log;
DatagramPacket pack = new DatagramPacket(log.getBytes(),
log.getBytes().length, serverAddress, port);
socket.send(pack);
}
public void print(Class cls, String log) throws IOException {
print(cls.getSimpleName() + " " + log);
}
}
用法和Log寫入文件時一樣的,生成實例,在需要打日誌的地方print一下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
mLogSender = LogSender.create("192.168.1.184", 4567);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d(tag, e.getMessage());
}
log("onCreate()");
}
public void log(String msg) {
Log.d(tag, msg);
try {
mLogSender.print(AlarmManagerDemo.class, msg); //這裏發送
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d(tag, e.getMessage());
}
}
除了上面之外,還需要寫一個簡單的Java服務端程序接受發過來的日誌消息進行打印
public class ServerApp {
public static void main(String[] args) {
new Thread(new Server()).start();
}
private static class Server implements Runnable {
@Override
public void run() {
ServerSocket mServerSocket = null;
try {
mServerSocket = new ServerSocket(4567);
Socket client = mServerSocket.accept();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(client.getInputStream()));
while(true) {
String str = bufferedReader.readLine();
System.out.println(str);
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try {
mServerSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}
}
}
}
}
效果圖: