1:首先讲述一下logcat指令
logcat [<option>] ... [<filter-spec>] ...
* 注意:filter-spec 【过滤规则】必须放在最后
如下
//logcat time -f /sdcard/log.txt *:E //过滤规则放到参数的最后
不能将 -f 指令放到最后
2:在程序中读取日志
思想是:在程序中开启一个Process 启动logcat。
然后开启另一个线程读取logcat中的数据流, 并输出到文件中
完成源码如下
需要的权限,分别是【读取log,操作sdcard】
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
package com.mmb.shop.service;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
/**
* logcat [<option>] ... [<filter-spec>] ...
* 注意:filter-spec必须放在最后
* @author coffee
*/
public class LogService extends Service {
private static final String TAG = "LogService";
private String LOG_FILE = "/sdcard/log.txt"; //
private LogOutputThread logThread;
private Process proc;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
//logcat time -f /sdcard/log.txt *:E //过滤规则放到参数的最后
String cmdLine = "logcat -v time"; //-v 是格式化,意思是输出时间 *:E *代表任意TAB, E指的是过滤级别
try{
proc = Runtime.getRuntime().exec(cmdLine);
logThread = new LogOutputThread(proc.getInputStream());
logThread.start();
//proc.waitFor();
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (proc != null) {
proc.destroy();
}
logThread.setOver(true);//结束log线程
}
/**
* log线程
* 负责从stdout流中读取log
* @author coffee
*/
public class LogOutputThread extends Thread {
private BufferedReader reader;
private BufferedWriter writer;
private boolean isOver = false;
public LogOutputThread(InputStream in){
try{
reader = new BufferedReader(new InputStreamReader(in));
writer = new BufferedWriter(new FileWriter(new File(LOG_FILE)));
}catch(Exception e){
Log.e(TAG, e.getMessage());
}
}
@Override
public void run() {
String line = null;
try{
while(true){
line = reader.readLine();
if(line != null){
writer.write(line);
writer.write("\n");
writer.flush();
}
if(isOver){
break;
}
}
}catch(Exception e){
e.printStackTrace();
}
}
public void setOver(boolean isOver) {
this.isOver = isOver;
}
}
}