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

  • 相关阅读:
    发布几个DNN模块自己写的,功能还不完善
    c#冒泡排序正解!
    74很多小学生在学习加法时,发现“进位”特别容易出错。你的任务是计算两个三位数在相加时需要多少次进位。你编制的程序应当可以连续处理多组数据,直到读到两个0(这是输入结束标记)。
    69 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?首行输入n,表示有多少组测试数据(n<10)随后n行每行输入一组测试数据 N( 0 < N < 1000000 )
    96已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n1位的数。第一行为M,表示测试数据组数。接下来M行,每行包含一个测试数据。
    101输入两点坐标(X1,Y1),(X2,Y2)(0<=x1,x2,y1,y2<=1000),计算并输出两点间的距离第一行输入一个整数n(0<n<=1000),表示有n组测试数据;随后每组占一行由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开 对于每组输入数据,输出一行结果保留两位
    266 给定一行字符,逆序输出此行(空格.数字不输出)
    98描述 输入一个百分制的成绩M,将其转换成对应的等级,具体转换规则如下:90~100为A;80~89为B;70~79为C;60~69为D;0~59为E;输入 第一行是一个整数N,表示测试数据的组数(N<10)
    50爱摘苹果的小明小明家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,小明就会跑去摘苹果。小明有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及小明把手伸直的时候能够达到的最大高度请帮小明算一下她能够摘到的苹果的数
    100 小南刚学了二进制,他想知道一个数的二进制表示中有多少个1,你能帮他写一个程序来完成这个任务吗?
  • 原文地址:https://www.cnblogs.com/tc310/p/4211976.html
Copyright © 2011-2022 走看看