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


    分享一个项目中用到的日志统计并提交服务器的日志工具类.

    通过过得当前app的PID,采用命令行的方式实用logcat工具过滤日志。

    源码如下:

    项目地址:http://code.google.com/p/andutils/

    001package org.and.util;
    002 
    003import java.io.BufferedReader;
    004import java.io.File;
    005import java.io.FileNotFoundException;
    006import java.io.FileOutputStream;
    007import java.io.IOException;
    008import java.io.InputStreamReader;
    009import java.util.ArrayList;
    010import java.util.List;
    011 
    012import android.content.Context;
    013import android.os.Environment;
    014  
    015 
    016/**
    017 * TODO: log日志统计保存、上传-工具类
    018 *
    019 * @author hljdrl@gmail.com
    020 
    021 * @date 2012-8-27 上午11:43:52
    022 
    023 */
    024 
    025public class LogcatHelper {
    026 
    027    private static LogcatHelper INSTANCE = null;
    028 
    029    private static String PATH_LOGCAT ;
    030 
    031    private LogDumper mLogDumper = null;
    032 
    033    private Context mContext;
    034 
    035    private int mPId;
    036 
    037    /**
    038 
    039     * 初始化目录
    040 
    041     * */
    042 
    043    public static void init(Context context)
    044 
    045    {
    046 
    047    StringBuffer LogPath = new StringBuffer();
    048 
    049    LogPath.append(Environment.getExternalStorageDirectory());
    050 
    051    LogPath.append("/Android/data/");
    052 
    053    LogPath.append(context.getPackageName()).append("/");
    054 
    055    LogPath.append("logs").append("/");
    056 
    057    PATH_LOGCAT = LogPath.toString();
    058 
    059    //
    060 
    061File file =new  File(PATH_LOGCAT);
    062 
    063if(!file.exists()){
    064 
    065file.mkdirs();
    066 
    067}
    068 
    069    }
    070 
    071    public static LogcatHelper getInstance(Context context)
    072 
    073    {
    074 
    075    if(INSTANCE == null){
    076 
    077    INSTANCE = new LogcatHelper(context);
    078 
    079    }
    080 
    081    return INSTANCE;
    082 
    083    }
    084 
    085    private LogcatHelper(Context context) {
    086 
    087    mContext = context;
    088 
    089    mPId = android.os.Process.myPid();
    090 
    091}
    092 
    093public void start() {
    094 
    095if(mLogDumper==null){
    096 
    097mLogDumper = new LogDumper(String.valueOf(mPId),PATH_LOGCAT);
    098 
    099mLogDumper.start();
    100 
    101}
    102 
    103}
    104 
    105public void stop()
    106 
    107{
    108 
    109if(mLogDumper!=null){
    110 
    111mLogDumper.stopLogs();
    112 
    113mLogDumper = null;
    114 
    115}
    116 
    117}
    118 
    119public  void sendLogMessage(Context context,String user)
    120 
    121{
    122 
    123if(mLogDumper!=null){
    124 
    125mLogDumper.setLogFileLock(true);
    126 
    127String file  = mLogDumper.getLogFileName();
    128 
    129File sendFile = new File(file);
    130 
    131if(sendFile.exists() && sendFile.length()>2000){
    132 
    133try{
    134 
    135EmailHelper.sendMail(context, user, file);
    136 
    137}catch(Exception ex){
    138 
    139ex.printStackTrace();
    140 
    141}
    142 
    143File newFile = new File(file);
    144 
    145try {
    146 
    147newFile.createNewFile();
    148 
    149} catch (IOException e) {
    150 
    151e.printStackTrace();
    152 
    153}
    154 
    155}
    156 
    157mLogDumper.setLogFileLock(false);
    158 
    159}
    160 
    161}
    162 
    163private class LogDumper extends Thread{
    164 
    165String fileName;
    166 
    167private Process logcatProc;
    168 
    169   private BufferedReader mReader = null;
    170 
    171private boolean mRunning = false;
    172 
    173String cmds=null;
    174 
    175private final String mPID;
    176 
    177private FileOutputStream out = null;
    178 
    179private List<String> logsMessage = new ArrayList<String>();
    180 
    181private boolean mLogFileLock = false;
    182 
    183private String logFileName;
    184 
    185public void setLogFileLock(boolean lock){
    186 
    187mLogFileLock = lock;
    188 
    189}
    190 
    191public boolean isLogFileLock()
    192 
    193{
    194 
    195return mLogFileLock;
    196 
    197}
    198 
    199public LogDumper(String pid,String file) {
    200 
    201mPID = String.valueOf(pid);
    202 
    203fileName = file;
    204 
    205File mFile = new File(fileName,"error.txt");
    206 
    207if(!mFile.exists()){
    208 
    209try {
    210 
    211mFile.createNewFile();
    212 
    213} catch (IOException e) {
    214 
    215e.printStackTrace();
    216 
    217}
    218 
    219}
    220 
    221try {
    222 
    223logFileName = mFile.toString();
    224 
    225out = new FileOutputStream(mFile,true);
    226 
    227} catch (FileNotFoundException e) {
    228 
    229e.printStackTrace();
    230 
    231}
    232 
    233/**
    234 
    235* 日志等级:*:v  , *:d  , *:w , *:e , *:f  , *:s
    236 
    237* 显示当前mPID程序的 E和W等级的日志.
    238 
    239* */
    240 
    241cmds ="logcat *:e *:w | grep \"("+mPID+")\"";
    242 
    243}
    244 
    245public String getLogFileName()
    246 
    247{
    248 
    249return logFileName;
    250 
    251}
    252 
    253public void stopLogs() {
    254 
    255mRunning = false;
    256 
    257}
    258 
    259private boolean checkFileMaxSize(String file){
    260 
    261File sizefile = new File(file);
    262 
    263if(sizefile.exists()){
    264 
    265//1.5MB
    266 
    267if(sizefile.length()>1572864){
    268 
    269return true;
    270 
    271}
    272 
    273else {
    274 
    275return false;
    276 
    277}
    278 
    279}else {
    280 
    281return false;
    282 
    283}
    284 
    285}
    286 
    287  
    288 
    289@Override
    290 
    291public void run() {
    292 
    293System.out.println("LogCatHelper'");
    294 
    295mRunning = true;
    296 
    297try {
    298 
    299logcatProc = Runtime.getRuntime()
    300 
    301.exec(cmds);
    302 
    303  
    304 
    305mReader = new BufferedReader(new InputStreamReader(
    306 
    307logcatProc.getInputStream()), 1024);
    308 
    309String line = null;
    310 
    311while (mRunning && (line = mReader.readLine()) != null) {
    312 
    313if (!mRunning) {
    314 
    315break;
    316 
    317}
    318 
    319if (line.length() == 0) {
    320 
    321continue;
    322 
    323}
    324 
    325synchronized (out) {
    326 
    327if (out != null) {
    328 
    329boolean maxSize = checkFileMaxSize(getLogFileName());
    330 
    331if(maxSize){
    332 
    333//文件大小超过1.5mb
    334 
    335sendLogMessage(mContext, DeviceHelper.getInstance(mContext).getImei());
    336 
    337}
    338 
    339if (isLogFileLock()) {
    340 
    341if(line.contains(mPID)){
    342 
    343logsMessage.add(line.getBytes() + "\n");
    344 
    345}
    346 
    347} else {
    348 
    349if(logsMessage.size()>0){
    350 
    351for(String _log:logsMessage){
    352 
    353out.write(_log.getBytes());
    354 
    355}
    356 
    357logsMessage.clear();
    358 
    359}
    360 
    361/**
    362 
    363* 再次过滤日志,筛选当前日志中有 mPID 则是当前程序的日志.
    364 
    365* */
    366 
    367if(line.contains(mPID)){
    368 
    369out.write(line.getBytes());
    370 
    371out.write("\n".getBytes());
    372 
    373}
    374 
    375}
    376 
    377}
    378 
    379}
    380 
    381  
    382 
    383}
    384 
    385} catch (IOException e) {
    386 
    387e.printStackTrace();
    388 
    389return;
    390 
    391} finally {
    392 
    393if (logcatProc != null) {
    394 
    395logcatProc.destroy();
    396 
    397logcatProc = null;
    398 
    399}
    400 
    401if (mReader != null) {
    402 
    403try {
    404 
    405mReader.close();
    406 
    407mReader = null;
    408 
    409} catch (IOException e) {
    410 
    411e.printStackTrace();
    412 
    413}
    414 
    415}
    416 
    417if(out!=null){
    418 
    419try {
    420 
    421out.close();
    422 
    423} catch (IOException e) {
    424 
    425e.printStackTrace();
    426 
    427}
    428 
    429out = null;
    430 
    431}
    432 
    433}
    434 
    435}
    436 
    437}
    438 
    439  
    440 
    441}
  • 相关阅读:
    Javascript
    CSS3新增特性HTML标签类型
    HTML5新增的标签
    prototype __proto__ Function
    oninput
    extend
    hasOwnProperty()
    this prototype constructor
    Array类型判断
    指针
  • 原文地址:https://www.cnblogs.com/shihao/p/2707565.html
Copyright © 2020-2023  润新知