美文网首页
保存logcat日志到本地

保存logcat日志到本地

作者: 主音King | 来源:发表于2018-12-25 11:59 被阅读22次

    权限

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

    注意:如果无法生成文件,请到应用中打开读写权限(对于api>=23)
    原理:
    根据cmd命令来轮训过滤系统日志,日志等级:*:v , *:d , *:w , *:e , *:f , *:s
    当然还可以检索关键字过滤

    Runtime.getRuntime().exec(cmds);
    

    详细代码:

    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 George
     * Description:
     */
    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 + "DATASHOWJI";
            } else {// 如果SD卡不存在,就保存到本应用的目录下
                PATH_LOGCAT = context.getFilesDir().getAbsolutePath() + File.separator + "DATASHOWJI";
            }
            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 {
                    File file = new File(dir, "MyAPP-" + MyDate.getFileName() + ".log");
                    out = new FileOutputStream(file);
                } 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 + ")\"";
                cmds = "logcat *:e *:d | 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;
                    }
    
                }
    
            }
        }
    
        static class MyDate {
            static String getDateEN() {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return format.format(new Date(System.currentTimeMillis()));
            }
    
            static String getFileName() {
                return "test";
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:保存logcat日志到本地

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