给大家分享一个项目中用到的日志统计并提交服务器的日志工具类.
通过过得当前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://android.662p.com/thread-216-1-1.html

logcat保存当前应用程序的日志并上传服务器或指定邮箱的更多相关文章

  1. Laravel中的日志与上传

    PHP中的框架众多,我自己就接触了好几个.大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了.也许有好多人吐槽TP,但是个人感觉不能说哪个框架好,哪个框架不好,再不好的框架你能把源码读上一遍,框架 ...

  2. 微信小程序:多张图片上传

    最近在写小程序的相册,需要多张图片的上传.因为小程序不支持数组的多张图片同时上传,然后根据自己的需求+借鉴网上各位大神的案例,总算搞定.分享下,不足之处,多多指教哦 页面wxml: <form ...

  3. 微信小程序简单封装图片上传组件

    微信小程序简单封装图片上传组件 希望自己 "day day up" -----小陶 我从哪里来 在写小程序的时候需要上传图片,个人觉得官方提供的 Uploader 组件不是太好用, ...

  4. Android将应用程序的崩溃信息如何保存到本地文件,并上传服务器

    导语:最近实在是太忙了,没有怎么更新公众号,也没有怎么认真去写一些内容,在这里先给关注我的朋友说一声抱歉,可能在接下来的一段时间,还是很忙,但是我会争取抽空多分享一下技术文章,给大家看,共同进步,也希 ...

  5. MVC应用程序中管理(更新)上传的文件

    实现上传文件功能,有时上传也会操作出错,能让用户有改正有机会,开发上传文件能有更新的功能. 文件上传时,如果是存储于应用程序某一目录的话,在更新时需要了解一些流程,先是删除旧文件,更新数据表相关信息, ...

  6. 如何上传网站程序(文件浏览器上传网页、FileZilla上传网站程序)

    问题场景: 网页制作完成后,程序需上传至虚拟主机. 注意事项: Windows系统的主机请将全部网页文件直接上传到FTP根目录,即 / . Linux系统的主机请将全部网页文件直接上传到 /htdoc ...

  7. iOS 日志系统 本地日志打包上传到服务器

    日志系统主要包含两个部分 1.本地保存 我们知道NSLog打印的日志一般都是直接输出到控制台,开发人员可以在控制台直接看到实时打印的log,既然可以在控制台输出,那么能否将日志输出到其他地方呢,比如说 ...

  8. ios上传应用后,审核流程完成前(reveiw)修改了程序内容,如何上传替换

    其实挺简单,只需要更改下version和build版本 看图说话就可以.我的程序之前版的版本设置 修改bug之后的设置: 然后重新打包就好了,提示打包成功后,在itunesconnect查看发现 选中 ...

  9. 微信小程序实现图片是上传、预览功能

    本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...

随机推荐

  1. scrapy 模拟登录后再抓取

    深度好文: from scrapy.contrib.spiders.init import InitSpider from scrapy.http import Request, FormReques ...

  2. 20145305 《Java程序设计》第2周学习总结

    教材学习内容总结 1.boolean类型可表示true与false 2.储存值超类型范围会出现溢值 3.变量在命名时不可以使用数字作为开头,不可以使用一些特殊字符,不可以与JAVA关键词同名,不可以与 ...

  3. cocos2d-x的环境的搭建

    1.首先提出一个我从开始接触cocosstudio和cocos2d-x的认识的误区,就是cocosstudio和cocos2d-x的区别是什么呢? cocosstudio是辅助工具,只不过它可以帮助我 ...

  4. github入门

    一.先了解 相比CVS\SVN优势: - 支持离线开发,离线Repository- 强大的分支功能,适合多个独立开发者协作- 速度快 github 本地有仓库,储存着所有repository的历史: ...

  5. 如何安装iso镜像文件

    1.使用压缩软件打开iso文件 2.点击setdup.exe文件,双击打开 3.解压缩后等待安装

  6. 【转贴】全站 HTTPS 来了

    http://geek.csdn.net/news/detail/48765 作者:腾讯TEG架构平台部静态加速组高级工程师 刘强 最近大家在使用百度.谷歌或淘宝的时候,是不是注意浏览器左上角已经全部 ...

  7. Django基础篇之数据库选择及相关操作

    在djanjo框架中我们最常用的框架分别就是mysql和sqlit了,下面我们将分别讲述一下这俩种数据库的基础必备知识 mysql 一.利用命令创建(在终端上执行) 1.首先创建一个project项目 ...

  8. SQL基本语句(1)

    利用select的结果创建表 可以通过选择一个表的全部内容(无 WHERE 子句)来拷贝一个表,或利用一个总是失败的 WHERE 子句来创建一个空表,如: mysql> CREATE TABLE ...

  9. 如何由jdk的安装版本改成非安装版本

    背景. 官网一般只提供windows下的exe文件,不提供zip打包文件.有些不愿意使用安装版本. 解决方法 本文以windows 7下安装jdk-6u35-windows-x64.exe为例说明 1 ...

  10. 学习联系 Java阶乘相关练习

    题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度 double hou = 0.00008; for (int i = 1; i > 0; i++) { hou = ...