Android logcat保存当前应用程序的日志并上传服务器或指定邮箱

jopen 12年前

给大家分享一个项目中用到的日志统计并提交服务器的日志工具类.
通过过得当前app的PID,采用命令行的方式实用logcat工具过滤日志。
代码区:

package org.and.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 java.util.ArrayList;  import java.util.List;    import android.content.Context;  import android.os.Environment;      /**  * TODO: log日志统计保存、上传-工具类  *  * @author hljdrl@gmail.com    * @date 2012-8-27 上午11:43:52    */    public class LogcatHelper {    private static LogcatHelper INSTANCE = null;    private static String PATH_LOGCAT ;    private LogDumper mLogDumper = null;    private Context mContext;    private int mPId;    /**    * 初始化目录    * */    public static void init(Context context)    {    StringBuffer LogPath = new StringBuffer();    LogPath.append(Environment.getExternalStorageDirectory());    LogPath.append("/Android/data/");    LogPath.append(context.getPackageName()).append("/");    LogPath.append("logs").append("/");    PATH_LOGCAT = LogPath.toString();    //    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) {    mContext = 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;    }    }    public void sendLogMessage(Context context,String user)    {    if(mLogDumper!=null){    mLogDumper.setLogFileLock(true);    String file = mLogDumper.getLogFileName();    File sendFile = new File(file);    if(sendFile.exists() && sendFile.length()>2000){    try{    EmailHelper.sendMail(context, user, file);    }catch(Exception ex){    ex.printStackTrace();    }    File newFile = new File(file);    try {    newFile.createNewFile();    } catch (IOException e) {    e.printStackTrace();    }    }    mLogDumper.setLogFileLock(false);    }    }    private class LogDumper extends Thread{    String fileName;    private Process logcatProc;    private BufferedReader mReader = null;    private boolean mRunning = false;    String cmds=null;    private final String mPID;    private FileOutputStream out = null;    private List<String> logsMessage = new ArrayList<String>();    private boolean mLogFileLock = false;    private String logFileName;    public void setLogFileLock(boolean lock){    mLogFileLock = lock;    }    public boolean isLogFileLock()    {    return mLogFileLock;    }    public LogDumper(String pid,String file) {    mPID = String.valueOf(pid);    fileName = file;    File mFile = new File(fileName,"error.txt");    if(!mFile.exists()){    try {    mFile.createNewFile();    } catch (IOException e) {    e.printStackTrace();    }    }    try {    logFileName = mFile.toString();    out = new FileOutputStream(mFile,true);    } catch (FileNotFoundException e) {    e.printStackTrace();    }    /**    * 日志等级:*:v , *:d , *:w , *:e , *:f , *:s    * 显示当前mPID程序的 E和W等级的日志.    * */    cmds ="logcat *:e *:w | grep \"("+mPID+")\"";    }    public String getLogFileName()    {    return logFileName;    }    public void stopLogs() {    mRunning = false;    }    private boolean checkFileMaxSize(String file){    File sizefile = new File(file);    if(sizefile.exists()){    //1.5MB    if(sizefile.length()>1572864){    return true;    }    else {    return false;    }    }else {    return false;    }    }        @Override    public void run() {    System.out.println("LogCatHelper'");    mRunning = true;    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;    }    synchronized (out) {    if (out != null) {    boolean maxSize = checkFileMaxSize(getLogFileName());    if(maxSize){    //文件大小超过1.5mb    sendLogMessage(mContext, DeviceHelper.getInstance(mContext).getImei());    }    if (isLogFileLock()) {    if(line.contains(mPID)){    logsMessage.add(line.getBytes() + "\n");    }    } else {    if(logsMessage.size()>0){    for(String _log:logsMessage){    out.write(_log.getBytes());    }    logsMessage.clear();    }    /**    * 再次过滤日志,筛选当前日志中有 mPID 则是当前程序的日志.    * */    if(line.contains(mPID)){    out.write(line.getBytes());    out.write("\n".getBytes());    }    }    }    }        }    } catch (IOException e) {    e.printStackTrace();    return;    } 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;    }    }    }    }        }

来自:http://www.cnblogs.com/huasili/p/3428709.html