相信大家在做应用调试的时候,不可能时时通过USB线连着电脑去查看log信息,所以,将应用的log信息保存到手机本地就很有必要了,有助我们从这些log信息中提取有用的部分,以解决一些bug,下面我把网上分享的代码中作了一些精简,作为开发者使用,个人觉得没必要通过用户上传给我们,用户上传的不需要这么庞大的log信息,仅仅那部分崩溃的log信息即可,可参考我的另外一篇blog:http://blog.csdn.net/weidi1989/article/details/7927273

好了,废话不多说,直接分享封装好的log信息类:LogcatHelper

  1. package com.way.util;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import android.content.Context;
  9. import android.os.Environment;
  10. /**
  11. * log日志统计保存
  12. *
  13. * @author way
  14. *
  15. */
  16. public class LogcatHelper {
  17. private static LogcatHelper INSTANCE = null;
  18. private static String PATH_LOGCAT;
  19. private LogDumper mLogDumper = null;
  20. private int mPId;
  21. /**
  22. *
  23. * 初始化目录
  24. *
  25. * */
  26. public void init(Context context) {
  27. if (Environment.getExternalStorageState().equals(
  28. Environment.MEDIA_MOUNTED)) {// 优先保存到SD卡中
  29. PATH_LOGCAT = Environment.getExternalStorageDirectory()
  30. .getAbsolutePath() + File.separator + "miniGPS";
  31. } else {// 如果SD卡不存在,就保存到本应用的目录下
  32. PATH_LOGCAT = context.getFilesDir().getAbsolutePath()
  33. + File.separator + "miniGPS";
  34. }
  35. File file = new File(PATH_LOGCAT);
  36. if (!file.exists()) {
  37. file.mkdirs();
  38. }
  39. }
  40. public static LogcatHelper getInstance(Context context) {
  41. if (INSTANCE == null) {
  42. INSTANCE = new LogcatHelper(context);
  43. }
  44. return INSTANCE;
  45. }
  46. private LogcatHelper(Context context) {
  47. init(context);
  48. mPId = android.os.Process.myPid();
  49. }
  50. public void start() {
  51. if (mLogDumper == null)
  52. mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);
  53. mLogDumper.start();
  54. }
  55. public void stop() {
  56. if (mLogDumper != null) {
  57. mLogDumper.stopLogs();
  58. mLogDumper = null;
  59. }
  60. }
  61. private class LogDumper extends Thread {
  62. private Process logcatProc;
  63. private BufferedReader mReader = null;
  64. private boolean mRunning = true;
  65. String cmds = null;
  66. private String mPID;
  67. private FileOutputStream out = null;
  68. public LogDumper(String pid, String dir) {
  69. mPID = pid;
  70. try {
  71. out = new FileOutputStream(new File(dir, "GPS-"
  72. + MyDate.getFileName() + ".log"));
  73. } catch (FileNotFoundException e) {
  74. // TODO Auto-generated catch block
  75. e.printStackTrace();
  76. }
  77. /**
  78. *
  79. * 日志等级:*:v , *:d , *:w , *:e , *:f , *:s
  80. *
  81. * 显示当前mPID程序的 E和W等级的日志.
  82. *
  83. * */
  84. // cmds = "logcat *:e *:w | grep \"(" + mPID + ")\"";
  85. // cmds = "logcat  | grep \"(" + mPID + ")\"";//打印所有日志信息
  86. // cmds = "logcat -s way";//打印标签过滤信息
  87. cmds = "logcat *:e *:i | grep \"(" + mPID + ")\"";
  88. }
  89. public void stopLogs() {
  90. mRunning = false;
  91. }
  92. @Override
  93. public void run() {
  94. try {
  95. logcatProc = Runtime.getRuntime().exec(cmds);
  96. mReader = new BufferedReader(new InputStreamReader(
  97. logcatProc.getInputStream()), 1024);
  98. String line = null;
  99. while (mRunning && (line = mReader.readLine()) != null) {
  100. if (!mRunning) {
  101. break;
  102. }
  103. if (line.length() == 0) {
  104. continue;
  105. }
  106. if (out != null && line.contains(mPID)) {
  107. out.write((MyDate.getDateEN() + "  " + line + "\n")
  108. .getBytes());
  109. }
  110. }
  111. } catch (IOException e) {
  112. e.printStackTrace();
  113. } finally {
  114. if (logcatProc != null) {
  115. logcatProc.destroy();
  116. logcatProc = null;
  117. }
  118. if (mReader != null) {
  119. try {
  120. mReader.close();
  121. mReader = null;
  122. } catch (IOException e) {
  123. e.printStackTrace();
  124. }
  125. }
  126. if (out != null) {
  127. try {
  128. out.close();
  129. } catch (IOException e) {
  130. e.printStackTrace();
  131. }
  132. out = null;
  133. }
  134. }
  135. }
  136. }
  137. }

记得加上权限:

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.READ_LOGS" />

另外把那个时间的工具类也分享一下:

  1. package com.way.util;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. public class MyDate {
  5. public static String getFileName() {
  6. SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
  7. String date = format.format(new Date(System.currentTimeMillis()));
  8. return date;// 2012年10月03日 23:41:31
  9. }
  10. public static String getDateEN() {
  11. SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  12. String date1 = format1.format(new Date(System.currentTimeMillis()));
  13. return date1;// 2012-10-03 23:41:31
  14. }
  15. }

OK,所有事情做完之后,在我们的应用中start一下就OK了,使用完之后,记得调用一下stop:

    1. public class GPSApplication extends Application {
    2. @Override
    3. public void onCreate() {
    4. // TODO Auto-generated method stub
    5. LogcatHelper.getInstance(this).start();
    6. }
    7. }

原文:http://blog.csdn.net/way_ping_li/article/details/8487866

Android将应用log信息保存文件的更多相关文章

  1. LogcatHelperDemo【应用log信息保存成本地文件】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录下LogcatHelper的使用,并对原有代码进行了修改[因为保存到应用内的目录中不需要申请权限,所以去掉保存到SD的功能- ...

  2. Android将程序崩溃信息保存本地文件

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...

  3. 【Android Developers Training】 25. 保存文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 解决在web项目使用log4j中无法将log信息写入文件

    这是log4j.properties中关于的配置 log4j.appender.appender2.File=F:/myeclipseworkspace2/SecondBook2/log/second ...

  5. android 项目中log信息的正确处理

    我们在做项目中,调试程序的时候通常是debug或者打log,特别是看一些json数据之类的,都喜欢打log看看,可是在项目上线时log信息一定不能被打印出来,大家能够平时下载一些做的烂的app,连接e ...

  6. openwrt 下python程序后台运行,并将打印信息保存文件

    python -u gw20191223.py  > test.log 1 2 & "python" 表示执行python代码 "-u" 表示不启 ...

  7. 查看Android系统中硬件信息的文件

    文件目录: 使用Linux命令,进入到/proc目录 进入/proc目录,可以查看内存信息(memoinfo)或CPU信息(cpuinfo),使用cat命令

  8. python开发_搜索本地文件信息写入文件

    功能:#在指定的盘符,如D盘,搜索出与用户给定后缀名(如:jpg,png)相关的文件 #然后把搜索出来的信息(相关文件的绝对路径),存放到用户指定的 #文件(如果文件不存在,则建立相应的文件)中 之前 ...

  9. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

随机推荐

  1. IDEA如何打包可运行jar的一个问题。

    转自http://bglmmz.iteye.com/blog/2058785 背景: 有时候,我们会用IDEA来开发一些小工具,需要打成可运行的JAR包:或者某些项目不是WEB应用,纯粹是后台应用,发 ...

  2. Java集合类之Hashtable

    package com.test; import java.util.*; public class Demo7_3 { public static void main(String[] args) ...

  3. Spring事务管理--多个ORM框架在使用时的情况分析

    公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在 ...

  4. Oracle Form属性、内置子程序、触发器、系统变量简要

    一.属性 1.1 通用属性 名称(Name) 子类信息(Subclass Information) 备注(Comments) 标题(Title) 方向(Direction) 字体名称(Font Nam ...

  5. bzoj1492

    好题+神题,首先肯定是dp,我们设f[i]为到第i天能获得的最多的B卷(设获得的钱数亦可)由题目hint可知,要么全买要么全卖,我们有f[i]=max(maxmoney,f[j]*b[i]+f[j]* ...

  6. Reflector+Reflexil 相结合实现对DLL文件修改

    在工作过程中,我们有可能遇到这样的问题:公司发给客户的软件包突然报错了,但是你知道哪里报错了,而这个代码已经编译成DLL文件了,源代码不在自己这里.怎么办呢?还好现在有Reflexil插件,这个插件只 ...

  7. Win系统下制作U盘CLOVER引导+安装原版Mavericks10.9

    啃苹果有一段时间了,之前一直用白苹果,但是白苹果配置有所限制,对于我搞音频的人来讲,显得有点拖沓.所以研究了将近2年的黑苹果,最近心血来潮给大家一个比较傻瓜式的教程,首先强调一点,黑苹果是需要折腾的, ...

  8. C# asp.net 操作Word的前提配置和简单的方法

    操作的前提: 1.要保证机器本身要安装OFFICE. 有时安装了Office,但是不能找到Microsoft Word 11.0(或者更高的版本) Object Library.那可能是因为在安装of ...

  9. C# Word 类库的深入理解

    using System;using System.Collections.Generic;using System.Text;using Microsoft.Office.Interop.Word; ...

  10. [King.yue]关于代码调试时的缓存问题的一个解决办法

    后台构造数据更改之后,页面数据一直不变,试过各种办法,清空浏览器缓存,停止端口重新运行,关掉程序重新打开,都不可以.最终全部重新生成之后,终于可以正常调试了. 另:调试ASP.NET网站程序的时候,为 ...