给大家分享一个项目中用到的日志统计并提交服务器的日志工具类.
通过过得当前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. CSS如何实现数字分页效果

    代码实例如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  2. NSSet类型 以及与NSArray区别

    NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合: NSSet  , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的,不像NSAr ...

  3. list,set,map,数组之间的相互转换详细解析

    1.list转setSet set = new HashSet(new ArrayList()); 2.set转listList list = new ArrayList(new HashSet()) ...

  4. [ActionScript] AS3解决html与flash鼠标滚轮冲突的问题

    JS端: <script type="text/javascript"> <!-- var winWidth = 0; var winHeight = 0; va ...

  5. CRM IFRAME 显示地图

    作者:卞功鑫  ,转载请保留.http://www.cnblogs.com/BinBinGo/p/5274409.html 需要背景: 现在已经有经纬度,需要在地图上显示出来. 环境: CRM 4.0 ...

  6. java代码中后台向前台传递list或map集合案例

    导入jar包 新建一个servert传递map集合 ajax.java代码: package servlet; import java.io.IOException; import java.io.P ...

  7. Ext 中xtype一览

    基本组件: xtype Class 描述 button Ext.Button 按钮 splitbutton Ext.SplitButton 带下拉菜单的按钮 cycle Ext.CycleButton ...

  8. nyoj 73 比大小

    点击打开链接 比大小 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如123456789123456789要大于 ...

  9. js对象2--工厂模式的由来--杂志

    一:工厂模式引入前提例子 先看一个案例 <script type="text/javascript"> var person= new Object(); //创建一个 ...

  10. ZigBee无线网络技术在小区路灯照明系统的应用

    小区路灯照明系统是楼宇智能的一部分,但受制于布线.成本等的问题,难以得以实施.随着计算机技术的迅猛发展,无线网络技术越来越成熟,ZigBee无线网络成本低.功耗低.传输距离远等的特点,非常适合在无线路 ...