当前位置: 代码迷 >> Android >> Android将使用log信息保存文件
  详细解决方案

Android将使用log信息保存文件

热度:63   发布时间:2016-05-01 11:11:01.0
Android将应用log信息保存文件

转载自http://www.2cto.com/kf/201301/182290.html

?

相信大家在做应用调试的时候,不可能时时通过USB线连着电脑去查看log信息,所以,将应用的log信息保存到手机本地就很有必要了,有助我们从这些log信息中提取有用的部分,以解决一些bug,下面我把网上分享的代码中作了一些精简,作为开发者使用,个人觉得没必要通过用户上传给我们,用户上传的不需要这么庞大的log信息,仅仅那部分崩溃的log信息即可,可参考我的另外一篇blog:http://blog.csdn.net/weidi1989/article/details/7927273。

? ? ?好了,废话不多说,直接分享封装好的log信息类:LogcatHelper
package com.way.util;    import java.io.BufferedReader;  import java.io.File;  import java.io.FileNotFoundException;  import java.io.FileOutputStream;  import java.io.IOException;  import java.io.InputStreamReader;    import android.content.Context;  import android.os.Environment;    /**  * log日志统计保存  *   * @author way  *   */    public class LogcatHelper {        private static LogcatHelper INSTANCE = null;      private static String PATH_LOGCAT;      private LogDumper mLogDumper = null;      private int mPId;        /**      *       * 初始化目录      *       * */      public void init(Context context) {          if (Environment.getExternalStorageState().equals(                  Environment.MEDIA_MOUNTED)) {// 优先保存到SD卡中              PATH_LOGCAT = Environment.getExternalStorageDirectory()                      .getAbsolutePath() + File.separator + "miniGPS";          } else {// 如果SD卡不存在,就保存到本应用的目录下              PATH_LOGCAT = context.getFilesDir().getAbsolutePath()                      + File.separator + "miniGPS";          }          File file = new File(PATH_LOGCAT);          if (!file.exists()) {              file.mkdirs();          }      }        public static LogcatHelper getInstance(Context context) {          if (INSTANCE == null) {              INSTANCE = new LogcatHelper(context);          }          return INSTANCE;      }        private LogcatHelper(Context context) {          init(context);          mPId = android.os.Process.myPid();      }        public void start() {          if (mLogDumper == null)              mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);          mLogDumper.start();      }        public void stop() {          if (mLogDumper != null) {              mLogDumper.stopLogs();              mLogDumper = null;          }      }        private class LogDumper extends Thread {            private Process logcatProc;          private BufferedReader mReader = null;          private boolean mRunning = true;          String cmds = null;          private String mPID;          private FileOutputStream out = null;            public LogDumper(String pid, String dir) {              mPID = pid;              try {                  out = new FileOutputStream(new File(dir, "GPS-"                          + MyDate.getFileName() + ".log"));              } catch (FileNotFoundException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }                /**              *               * 日志等级:*:v , *:d , *:w , *:e , *:f , *:s              *               * 显示当前mPID程序的 E和W等级的日志.              *               * */                // cmds = "logcat *:e *:w | grep \"(" + mPID + ")\"";              // cmds = "logcat  | grep \"(" + mPID + ")\"";//打印所有日志信息              // cmds = "logcat -s way";//打印标签过滤信息              cmds = "logcat *:e *:i | grep \"(" + mPID + ")\"";            }            public void stopLogs() {              mRunning = false;          }            @Override          public void run() {              try {                  logcatProc = Runtime.getRuntime().exec(cmds);                  mReader = new BufferedReader(new InputStreamReader(                          logcatProc.getInputStream()), 1024);                  String line = null;                  while (mRunning && (line = mReader.readLine()) != null) {                      if (!mRunning) {                          break;                      }                      if (line.length() == 0) {                          continue;                      }                      if (out != null && line.contains(mPID)) {                          out.write((MyDate.getDateEN() + "  " + line + "\n")                                  .getBytes());                      }                  }                } catch (IOException e) {                  e.printStackTrace();              } finally {                  if (logcatProc != null) {                      logcatProc.destroy();                      logcatProc = null;                  }                  if (mReader != null) {                      try {                          mReader.close();                          mReader = null;                      } catch (IOException e) {                          e.printStackTrace();                      }                  }                  if (out != null) {                      try {                          out.close();                      } catch (IOException e) {                          e.printStackTrace();                      }                      out = null;                  }                }            }        }    }  
?
记得加上权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <uses-permission android:name="android.permission.READ_LOGS" />  
?
另外把那个时间的工具类也分享一下:
package com.way.util;    import java.text.SimpleDateFormat;  import java.util.Date;    public class MyDate {      public static String getFileName() {          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");          String date = format.format(new Date(System.currentTimeMillis()));          return date;// 2012年10月03日 23:41:31      }        public static String getDateEN() {          SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");          String date1 = format1.format(new Date(System.currentTimeMillis()));          return date1;// 2012-10-03 23:41:31      }    }  
?
OK,所有事情做完之后,在我们的应用中start一下就OK了,使用完之后,记得调用一下stop:
public class GPSApplication extends Application {        @Override      public void onCreate() {          // TODO Auto-generated method stub          LogcatHelper.getInstance(this).start();      }  }  
?
?
?

?

  相关解决方案