zoukankan      html  css  js  c++  java
  • logcat保存当前应用程序的日志并上传服务器或指定邮箱

    给大家分享一个项目中用到的日志统计并提交服务器的日志工具类.
    通过过得当前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() + "
    ");
    
    }
    
    } 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("
    ".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

  • 相关阅读:
    解决laravel 429请求错误
    laravel的Validation检索验证错误消息
    Laravel通过用户名和密码查询
    Javascript 利用 switch 语句进行范围判断
    解决SourceTree每次拉取提交都需要输入密码的问题
    nginx ip配置反向代理为本地域名
    Linux top命令详解
    《Inside C#》笔记(六) 属性、数组、索引器
    《Inside C#》笔记(五) 方法
    《Inside C#》笔记(四) 类
  • 原文地址:https://www.cnblogs.com/huasili/p/3428709.html
Copyright © 2011-2022 走看看