有时候我们需要将打包好的apk给远端的客户使用测试,我们就需要将log打印到手机内置的文件夹中,以便于后面自己在解决bug的时候快速定位。不过我们当然不希望自己的项目有何种无理由的bug和致命的崩溃

收集log到文件夹中

有时候程序出现异常停止,而logcat 的相关信息很快会被冲掉,因而不能够及时的获取异常信息。(所有logUtil封装的也可以保存)

在这推荐单例模式对这个类进行操作

/**

* - Created by Luke on 2017/8/16

*/

public class LogcatManager {

private static LogcatManager INSTANCE = null;

//logcat的路径地址

private static String PATH_LOGCAT;

private LogDumper mLogDumper = null;

private int mPId;

private SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyyMMdd");

private SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

public static LogcatManager getInstance() {

if (INSTANCE == null) {

INSTANCE = new LogcatManager();

}

return INSTANCE;

}

private LogcatManager() {

mPId = android.os.Process.myPid();

}

private void setFolderPath(String folderPath) {

File folder = new File(folderPath);

if (!folder.exists()) {

folder.mkdirs();

}

if (!folder.isDirectory())

throw new IllegalArgumentException("The logcat folder path is not a directory: " + folderPath);

PATH_LOGCAT = folderPath.endsWith("/") ? folderPath : folderPath + "/";

}

public void start(String saveDirectoy) {

setFolderPath(saveDirectoy);

if (mLogDumper == null)

mLogDumper = new LogDumper(String.valueOf(mPId), PATH_LOGCAT);

mLogDumper.start();

}

public void stop() {

if (mLogDumper != null) {

mLogDumper.stopLogs();

mLogDumper = null;

}

}

private class LogDumper extends Thread {

private Process logcatProc;

private BufferedReader mReader = null;

private boolean mRunning = true;

String cmds = null;

private String mPID;

private FileOutputStream out = null;

public LogDumper(String pid, String dir) {

mPID = pid;

try {

out = new FileOutputStream(new File(dir, "logcat-" + simpleDateFormat1.format(new Date()) + ".log"), true);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

cmds = "logcat *:e *:i | grep \"(" + mPID + ")\"";

}

public void stopLogs() {

mRunning = false;

}

@Override

public void run() {

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;

}

if (out != null && line.contains(mPID)) {

out.write((simpleDateFormat2.format(new Date()) + " " + line + "\n").getBytes());

}

}

} catch (IOException e) {

e.printStackTrace();

} 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;

}

}

}

}

}

收集错误崩溃日志到文件夹中

这个一般是出现程序出现错误的时候才会自动保存到手机里的文件夹中,比如常见的NullPointerException,ArrayIndexOutOfBoundsException,SQLException ... and so on.

这个类的代码量有点多,不利于直观的看出来,在这只贴出重要的逻辑部分

还是推荐单例模式对这个类进行操作

/**

* 收集设备参数信息

*/

public void collectDeviceInfo(Context context) {

try {

PackageManager pm = context.getPackageManager();

PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);

if (pi != null) {

String versionName = pi.versionName == null ? "null" : pi.versionName;

String versionCode = pi.versionCode + "";

infos.put("versionName", versionName);

infos.put("versionCode", versionCode);

}

} catch (PackageManager.NameNotFoundException e) {

Logger.getLogger(TAG, "收集包信息时出错");

}

Field[] fields = Build.class.getDeclaredFields();

for (Field field : fields) {

try {

field.setAccessible(true);

infos.put(field.getName(), field.get(null).toString());

} catch (Exception e) {

Logger.getLogger(TAG, "收集包信息时出错");

}

}

}

-----------------------------------------保存错误信息到文件中---------------------------------------------------------------

/**

* @return 返回文件名称, 便于将文件传送到服务器

*/

private String saveCrashInfo2File(Throwable ex) {

StringBuffer sb = new StringBuffer();

for (Map.Entry entry : infos.entrySet()) {

String key = entry.getKey();

String value = entry.getValue();

sb.append(key).append("=").append(value).append("\n");

}

Writer writer = new StringWriter();

PrintWriter printWriter = new PrintWriter(writer);

ex.printStackTrace(printWriter);

Throwable cause = ex.getCause();

while (cause != null) {

cause.printStackTrace(printWriter);

cause = cause.getCause();

}

printWriter.close();

String result = writer.toString();

sb.append(result);

try {

long timestamp = System.currentTimeMillis();

String time = formatter.format(new Date());

String fileName = "crash-" + time + "-" + timestamp + ".log";

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

String path = "/sdcard/crash_police/";

File dir = new File(path);

if (!dir.exists()) {

dir.mkdirs();

}

FileOutputStream fos = new FileOutputStream(path + fileName);

sb.append("\r\n报错日期:");

sb.append(new Date(System.currentTimeMillis()).toLocaleString()).append("\r\n");

printStackTrace(sb, ex);

fos.write(sb.toString().getBytes());

fos.close();

}

return fileName;

} catch (Exception e) {

Logger.getLogger(TAG, "写入文件时出错...");

}

return null;

}

使用方法:

建议在自己的Application中进行开启log和Crash的收集

2.在onCreate里开始收集log startLogcat(),和CrashHandler.的初始化就可以了

3.onTerminate() 在程序终止的时候讲logcat的收集关闭,直接调用stopLogcat();就O 了

4.下面是开始和终止的方法

private void startLogcat() {

String folderPath = null;

if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

folderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Police-Logcat";

} else {

folderPath = this.getFilesDir().getAbsolutePath() + File.separator + "Police-Logcat";

}

LogcatManager.getInstance().start(folderPath);

}

private void stopLogcat() {

LogcatManager.getInstance().stop();

}

大功告成,经测试是木有任何问题的

android自带日志放的什么地方,Android 收集日志存放文件夹相关推荐

  1. android os能删掉那,安卓手机里的那些英文文件夹到底都是啥?可不可以删除?...

    原标题:安卓手机里的那些英文文件夹到底都是啥?可不可以删除? 对于使用安卓手机的强迫症患者来说,文件夹必须经常清理,尽管里面没有任何东西,也必须要彻底删除.虽然强迫症治好了,但总会不小心误删一些重要的 ...

  2. android qq 邮箱格式,QQ邮箱的正确格式有哪些?文件夹怎么发送呢

    QQ邮箱的正确格式有哪些?文件夹怎么发送呢?QQ邮箱格式怎么写呢?登录QQ邮箱后,如果你想给别人写信,却不知道如何写一封电子邮件,这个问题其实很简单,不过如何发送文件夹对有些用户来说,可能觉得尴尬,据 ...

  3. 计算机自带的超级锁怎么设置,万能锁加锁了文件夹加密超级大师的快捷方式怎么办?...

    Ice /ka 9:00:52 您好,我是夏冰软件在线客服,很高兴为您服务 .请问有什么我可以为您效劳的? Jerry 9:01:52 你好!遇到问题了,我在正式版文件夹加密超级大师上使用万能锁,把文 ...

  4. android酷狗缓存目录,酷狗缓存的歌曲在哪个文件夹_酷狗音乐缓存的歌曲在电脑哪个目录-win7之家...

    酷狗是一款很流行的音乐播放软件,当我们在听歌曲的时候,默认会缓存到文件夹中,方便下次没有网络的时候可以继续听这首歌,有些用户想要知道酷狗缓存的歌曲在哪个文件夹,我们可以从主界面中进入即可找到,接下来给 ...

  5. android mkdirs 不起作用,Android mkdirs()创建一个零字节文件而不是文件夹

    在我的 Android应用程序中,我试图在SD卡上创建以下文件夹: /mnt/sdcard/OSGiComponents/admin/felix-cache/ 这是代码: File cacheDir ...

  6. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  7. Win10通过带命令行的安全模式清除顽固的广告弹窗文件

    文章目录 前言 战斗经历 查找广告来源 开始删除程序 找管理员帮忙 进入安全模式 彻底删除文件 总结 前言 最近电脑开机后偶尔会出现一个弹窗,这种广告弹窗见的多了也就麻木了,本来也没放在心上,随手一关 ...

  8. Mac OS下文件夹(带linux部分)

    详解MAC硬盘中各个文件夹(增加linux部分参考 ★详解MAC硬盘中各个文件夹 显示隐藏文件的方法 用"终端",好处是不需要任何第三方工具,坏处是如果命令输错了,会有副作用.命令 ...

  9. android 手机文件夹显示白色的,手机上的文件夹为啥子全是英文的,目录怎么辨认,今天终于明白了...

    手机上的文件夹目录全是英文的,是不是很奇怪,咱们不是用的汉字吗?为什么手机里面的文件夹全是英文的,都不知道哪个该删,哪个不该删.不删又不行,手机用久了垃圾又多. 按道理来讲,国产手机应该用中文目录.难 ...

最新文章

  1. mxnet pick挑选
  2. 软件测试用python一般用来做什么-python能够做软件的自动化测试吗?
  3. 一些设计思想的汇集(2)
  4. 4.1.8 文件保护
  5. 多进程和多线程的优缺点
  6. 30-- A 代码记录分析
  7. 【渝粤教育】国家开放大学2018年秋季 0699-22T阅读与写作 参考试题
  8. laravel重定向自定义显示提示消息
  9. Spring boot上传文件(图片)到阿里云OSS(直接上传到应用服务器)
  10. mate10鸿蒙系统,华为将发布 MatePad Pro:搭载鸿蒙系统,麒麟 9000 处理器
  11. 80后开网店卖故事:1500多位为感觉而埋单
  12. android studio ndk 开发入门
  13. 2020年第十七届中国研究生数学建模竞赛赛题+解压码
  14. macOS Catalina 10.15.7 ISO/CDR 虚拟机镜像下载
  15. BT5R3安装及汉化
  16. 微博平台的RPC服务化实践
  17. 23种常见设计模式详解
  18. MFC实现像素鸟功能和一些改进
  19. 第二十三章:面向对象(3)
  20. [Python] GDAL/OGR操作矢量数据(shp、GeoJSON)

热门文章

  1. 蓝桥杯电子类单片机组模块——独立按键(一般作用)
  2. ChatGPT实现用C语言写一个扫雷小游戏
  3. 关于element-ui 中 table 鼠标悬停时高亮背景颜色的修改,添加fixed后颜色又出现问题
  4. 上传图片的时候,ios手机的图片会旋转90°
  5. Python之日期和时间
  6. mysql查看表结构 desc 表名;
  7. 40.qt quick- 高仿微信实现局域网聊天V4版本(支持gif动图表情包、消息聊天、拖动缩放窗口、支持Linux编译)...
  8. Latex基本操作 | 在引用文献后面加上DOI号
  9. 从药品到星系寻找,人工智能渗透进入科研人员的实验室
  10. jeesite手机端只有登录和系统首页,没有别的页面功能详解