zoukankan      html  css  js  c++  java
  • Android将应用log信息保存文件

    相信大家在做应用调试的时候,不可能时时通过USB线连着电脑去查看log信息,所以,将应用的log信息保存到手机本地就很有必要了,有助我们从这些log信息中提取有用的部分,以解决一些bug,下面我把网上分享的代码中作了一些精简,作为开发者使用,个人觉得没必要通过用户上传给我们,用户上传的不需要这么庞大的log信息,仅仅那部分崩溃的log信息即可

         好了,废话不多说,直接分享封装好的log信息类:LogcatHelper

    package com.way.util;
    
    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;
    
    /**
     * log日志统计保存
     * 
     * @author way
     * 
     */
    
    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 + "miniGPS";
            } else {// 如果SD卡不存在,就保存到本应用的目录下
                PATH_LOGCAT = context.getFilesDir().getAbsolutePath()
                        + File.separator + "miniGPS";
            }
            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, "GPS-"
                            + MyDate.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((MyDate.getDateEN() + "  " + line + "
    ")
                                    .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;
                    }
    
                }
    
            }
    
        }
    
    }
    View Code

    记得加上权限:

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

    另外把那个时间的工具类也分享一下:

    package com.way.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class MyDate {
        public static 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 static 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
        }
    
    }
    View Code

    OK,所有事情做完之后,在我们的应用中start一下就OK了,使用完之后,记得调用一下stop:

    public class GPSApplication extends Application {
    
        @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            LogcatHelper.getInstance(this).start();
        }
    }
  • 相关阅读:
    backup1
    backup
    The operation couldn’t be completed. (LaunchServicesError error 0.)
    drawRect & layoutSubviews 调用时间
    在撤销“本地修改”之后再恢复
    APP调用系统相册,使用3DTouch重压,崩溃
    IOS_UIButton去掉系统的按下高亮置灰效果
    navigationItem的leftBarButtonItem和rightBarButtonItem隐藏
    _BSMachError: (os/kern) invalid capability (20) _BSMachError: (os/kern) invalid name (15) 问题的解决
    删除button中除label之外的View
  • 原文地址:https://www.cnblogs.com/weixing/p/3414164.html
Copyright © 2011-2022 走看看