那麼這個示例會演示如何給你自己的apk加上log記錄功能,之所以會有這一個,是因爲當前所在項目在測試過程中是無法通過usb線連接電腦的(被硬件佔了),遠程調試也可以,但是會佔用端口切來切去麻煩,並且速度非常慢。於是考慮能不能夠把log日誌分時間段記錄在sd卡,這樣出問題可以直接獲取日誌,同時也可以爲後續的持續集成log上傳打下良好基礎。
PS:請無視項目名字,我懶得改了,因爲一開始是匹配自己項目的。
功能特點:
直接上運行結果:
app界面
原理解釋:
1.點擊開始記錄,綁定一個log記錄的服務
2.這個服務會初始化RecordStep對象,該對象負責讀取log信息並寫入文件
3.在每次寫的過程中,會獲取時間,如果大於x秒,那麼會重新創建一個新的文件流,繼續寫入,實現分時間記錄
4.按日記錄,查詢文件夾內是否存在當天記錄,不存在那麼會創建今天的日誌文件夾
代碼:
AirBotConst.java:保存一些個可配置的常量
public class AirBotConst {
public static final String LOG_DIR = Environment.getExternalStorageDirectory()+"/AirBotLog";
public static final String TODAY_DIR = Environment.getExternalStorageDirectory()+"/AirBotLog/"+Utils.getFolderTime();
public static final String NOW_FILE_NAME = Environment.getExternalStorageDirectory()+"/AirBotLog/"+Utils.getFolderTime()+"/"+Utils.getFileTime()+".log";
public static final long SPLIT_TIME = 10 * 1000; //log分片時間
}
RecordStep:核心的類,負責讀取記錄和按時間分片記錄log
public class RecordStep {
String TAG = RecordStep.class.getName();
boolean flag = true;
boolean nameChange_flag = false;
InputStream inputStream;
BufferedReader bufferedReader;
FileWriter fileWriter;
boolean clearBefore = false;
public void start(){
new writeThread().start();
}
class writeThread extends Thread{
@Override
public void run() {
beginRecord();
}
}
public void setClearBeforeEnable(){
clearBefore = true;
}
private void beginRecord() {
Log.i(TAG,"beging record");
try {
if(clearBefore){
Runtime.getRuntime().exec("logcat -c");
}
inputStream = Runtime.getRuntime().exec("logcat -v time").getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
fileWriter = new FileWriter(AirBotConst.NOW_FILE_NAME);
long s_time = System.currentTimeMillis();
String str = null;
while((str=bufferedReader.readLine())!=null){
//Log.i(TAG,str);
if(System.currentTimeMillis() - s_time > AirBotConst.SPLIT_TIME){
fileWriter.flush();
fileWriter.close();
fileWriter = new FileWriter(AirBotConst.TODAY_DIR+"/"+Utils.getFileTime()+".log");
//Log.i(TAG,"change record file!!!"+Utils.getFileTime());
s_time = System.currentTimeMillis();
}
fileWriter.write(str);
fileWriter.write("\n");
}
Log.i(TAG,"end?");
}catch (Exception e){
}finally {
if(fileWriter!=null){
try {
fileWriter.flush();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void stop(){
flag = false;
}
}
最後面是開源的代碼地址:
https://github.com/CloudHuan/LogRecord