美文网首页
Android log保存本地

Android log保存本地

作者: 郑永博 | 来源:发表于2019-01-20 12:18 被阅读0次
    package com.example.zhengyongbo.myapplication;
    
    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 android.content.Context;
    import android.os.Environment;
    
    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)) {
                PATH_LOGCAT = Environment.getExternalStorageDirectory().getAbsolutePath();
            } else {// 如果SD卡不存在,就保存到本应用的目录下
                PATH_LOGCAT = context.getFilesDir().getAbsolutePath();
            }
            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 static 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(PATH_LOGCAT + File.separator + "123.txt");
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    out = new FileOutputStream(file);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    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;
                    }
    
                }
    
            }
    
        }
    }
    
    

    1 、申请权限:

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

    2、在Application中添加

    LogcatHelper.getInstance(this).start();
    

    对您有帮助,看心情打赏

    相关文章

      网友评论

          本文标题:Android log保存本地

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