美文网首页猿码
Android应用log信息保存到手机本地

Android应用log信息保存到手机本地

作者: Liebling_zn | 来源:发表于2018-07-13 08:54 被阅读56次

    为了方便测试机不在手头上,但是出现问题的时候无法真机调试时,将报错的log信息存储到手机本地
    代码如下:

    import android.content.Context;
    import android.os.Environment;
    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 java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * Created by elena on 2017/9/4.
     */
    
    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 + "bsyqLog";
            } else {// 如果SD卡不存在,就保存到本应用的目录下
                PATH_LOGCAT = context.getFilesDir().getAbsolutePath()
                        + File.separator + "llvisionLog";
            }
            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, "log-"
                            + 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((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;
                    }
    
                }
    
            }
    
        }
            public  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  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
    //        }
    }
    

    权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <uses-permission android:name="android.permission.READ_LOGS" />  
    

    引用:

    public class MyApplication extends Application {  
      
        @Override  
        public void onCreate() {  
            // TODO Auto-generated method stub  
            LogcatHelper.getInstance(this).start();  
        }  
    } 
    

    相关文章

      网友评论

        本文标题:Android应用log信息保存到手机本地

        本文链接:https://www.haomeiwen.com/subject/phodpftx.html