zoukankan      html  css  js  c++  java
  • 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 + " ")  
    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

  • 相关阅读:
    读书笔记----软件设计原则、设计模式
    程伟杰 | 2021软件代码开发技术作业一 | 自我介绍+课程6问
    团队作业3-需求改进&系统设计
    团队项目作业2-需求规格说明书
    【Android实习】20场面试斩获大厂offer,我学会了什么
    通俗易懂,android是如何管理内存的
    关于Handler同步屏障你可能不知道的问题
    清晰图解深度分析HTTPS原理
    这一篇TCP总结请收下
    深入浅出Java线程池:源码篇
  • 原文地址:https://www.cnblogs.com/tc310/p/4211976.html
Copyright © 2011-2022 走看看