首页 > 代码库 > Android将应用log信息保存文件

Android将应用log信息保存文件

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

     好了,废话不多说,直接分享封装好的log信息类:LogcatHelper

[java] view plaincopy
 
  1. package com.way.util;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStreamReader;  
  9.   
  10. import android.content.Context;  
  11. import android.os.Environment;  
  12.   
  13. /** 
  14.  * log日志统计保存 
  15.  *  
  16.  * @author way 
  17.  *  
  18.  */  
  19.   
  20. public class LogcatHelper {  
  21.   
  22.     private static LogcatHelper INSTANCE = null;  
  23.     private static String PATH_LOGCAT;  
  24.     private LogDumper mLogDumper = null;  
  25.     private int mPId;  
  26.   
  27.     /** 
  28.      *  
  29.      * 初始化目录 
  30.      *  
  31.      * */  
  32.     public void init(Context context) {  
  33.         if (Environment.getExternalStorageState().equals(  
  34.                 Environment.MEDIA_MOUNTED)) {// 优先保存到SD卡中  
  35.             PATH_LOGCAT = Environment.getExternalStorageDirectory()  
  36.                     .getAbsolutePath() + File.separator + "miniGPS";  
  37.         } else {// 如果SD卡不存在,就保存到本应用的目录下  
  38.             PATH_LOGCAT = context.getFilesDir().getAbsolutePath()  
  39.                     + File.separator + "miniGPS";  
  40.         }  
  41.         File file = new File(PATH_LOGCAT);  
  42.         if (!file.exists()) {  
  43.             file.mkdirs();  
  44.         }  
  45.     }  
  46.   
  47.     public static LogcatHelper getInstance(Context context) {  
  48.         if (INSTANCE == null) {  
  49.             INSTANCE = new LogcatHelper(context);  
  50.         }  
  51.         return INSTANCE;  
  52.     }  
  53.   
  54.     private LogcatHelper(Context context) {  
  55.         init(context);  
  56.         mPId = android.os.Process.myPid();  
  57.     }  
  58.   
  59.     public void start() {  
  60.         if (mLogDumper == null)  
  61.             mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);  
  62.         mLogDumper.start();  
  63.     }  
  64.   
  65.     public void stop() {  
  66.         if (mLogDumper != null) {  
  67.             mLogDumper.stopLogs();  
  68.             mLogDumper = null;  
  69.         }  
  70.     }  
  71.   
  72.     private class LogDumper extends Thread {  
  73.   
  74.         private Process logcatProc;  
  75.         private BufferedReader mReader = null;  
  76.         private boolean mRunning = true;  
  77.         String cmds = null;  
  78.         private String mPID;  
  79.         private FileOutputStream out = null;  
  80.   
  81.         public LogDumper(String pid, String dir) {  
  82.             mPID = pid;  
  83.             try {  
  84.                 out = new FileOutputStream(new File(dir, "GPS-"  
  85.                         + MyDate.getFileName() + ".log"));  
  86.             } catch (FileNotFoundException e) {  
  87.                 // TODO Auto-generated catch block  
  88.                 e.printStackTrace();  
  89.             }  
  90.   
  91.             /** 
  92.              *  
  93.              * 日志等级:*:v , *:d , *:w , *:e , *:f , *:s 
  94.              *  
  95.              * 显示当前mPID程序的 E和W等级的日志. 
  96.              *  
  97.              * */  
  98.   
  99.             // cmds = "logcat *:e *:w | grep \"(" + mPID + ")\"";  
  100.             // cmds = "logcat  | grep \"(" + mPID + ")\"";//打印所有日志信息  
  101.             // cmds = "logcat -s way";//打印标签过滤信息  
  102.             cmds = "logcat *:e *:i | grep \"(" + mPID + ")\"";  
  103.   
  104.         }  
  105.   
  106.         public void stopLogs() {  
  107.             mRunning = false;  
  108.         }  
  109.   
  110.         @Override  
  111.         public void run() {  
  112.             try {  
  113.                 logcatProc = Runtime.getRuntime().exec(cmds);  
  114.                 mReader = new BufferedReader(new InputStreamReader(  
  115.                         logcatProc.getInputStream()), 1024);  
  116.                 String line = null;  
  117.                 while (mRunning && (line = mReader.readLine()) != null) {  
  118.                     if (!mRunning) {  
  119.                         break;  
  120.                     }  
  121.                     if (line.length() == 0) {  
  122.                         continue;  
  123.                     }  
  124.                     if (out != null && line.contains(mPID)) {  
  125.                         out.write((MyDate.getDateEN() + "  " + line + "\n")  
  126.                                 .getBytes());  
  127.                     }  
  128.                 }  
  129.   
  130.             } catch (IOException e) {  
  131.                 e.printStackTrace();  
  132.             } finally {  
  133.                 if (logcatProc != null) {  
  134.                     logcatProc.destroy();  
  135.                     logcatProc = null;  
  136.                 }  
  137.                 if (mReader != null) {  
  138.                     try {  
  139.                         mReader.close();  
  140.                         mReader = null;  
  141.                     } catch (IOException e) {  
  142.                         e.printStackTrace();  
  143.                     }  
  144.                 }  
  145.                 if (out != null) {  
  146.                     try {  
  147.                         out.close();  
  148.                     } catch (IOException e) {  
  149.                         e.printStackTrace();  
  150.                     }  
  151.                     out = null;  
  152.                 }  
  153.   
  154.             }  
  155.   
  156.         }  
  157.   
  158.     }  
  159.   
  160. }  


记得加上权限:

[html] view plaincopy
 
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  2. <uses-permission android:name="android.permission.READ_LOGS" />  


另外把那个时间的工具类也分享一下:

[java] view plaincopy
 
  1. package com.way.util;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5.   
  6. public class MyDate {  
  7.     public static String getFileName() {  
  8.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  9.         String date = format.format(new Date(System.currentTimeMillis()));  
  10.         return date;// 2012年10月03日 23:41:31  
  11.     }  
  12.   
  13.     public static String getDateEN() {  
  14.         SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  15.         String date1 = format1.format(new Date(System.currentTimeMillis()));  
  16.         return date1;// 2012-10-03 23:41:31  
  17.     }  
  18.   
  19. }  


OK,所有事情做完之后,在我们的应用中start一下就OK了,使用完之后,记得调用一下stop:

[java] view plaincopy
 
    1. public class GPSApplication extends Application {  
    2.   
    3.     @Override  
    4.     public void onCreate() {  
    5.         // TODO Auto-generated method stub  
    6.         LogcatHelper.getInstance(this).start();  
    7.     }  
    8. }  

 

原文:http://blog.csdn.net/way_ping_li/article/details/8487866

Android将应用log信息保存文件