Android学习之路------代码中获取Logcat打印日志并存放于文件中
来源:互联网 发布:多组数据的显著性差异 编辑:程序博客网 时间:2024/06/06 03:33
1.Logcat命令的使用
logcat -c 清除屏幕显示 logcat -d 显示 logcat 显示日志log logcat -f filename将日志输出到一个文件中logcat -v time 显示时间 logcat -v time -s tag:priority 这里会输出与priority相等或者优先级比priority优先级高的
priority有5种:
V — Verbose (优先级最低)D — Debug I — Info W — Warning E — ErrorF — Fatal S — Silent
比如我们在串口输入logcat -v time -s ScreenSaver:D
会打印出
01-02 10:30:05.690 I/ScreenSaver( 957): screen now time = 8934wait time :480
Screensaver是tag,因为I的优先级比D高,因此也会输出I的(Log.i());
2.如何在代码中运行命令行
这需要用到
Runtime.getRunntime.exec();
exec的参数一般为String [];
比如我们要抓取日志带时间,我们的代码可以这样写
Runtime.getRuntime.exec(new String[]{"logcat","-v","time","-s","ScreenSaver:D"})
通过exec直接运行”logcat -v time -s ScreenSaver:D”,是不行的。
上面Runntime.getRunntime.exec会返回Process对象,Process有6种方法可以调用:
1.destroy():杀掉子进程
2.exitValue():返回子进程的出口值,值 0 表示正常终止
3.getErrorStream():获取子进程的错误流
4.getInputStream():获取子进程的输入流
5.getOutputStream():获取子进程的输出流
6.waitFor():导致当前线程等待,如有必要,一直要等到由该 Process对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程,根据惯例,0表示正常终止
这里我们主要使用getInputStream()来获取打印日志的输入流
3.具体代码参考
这里我只截取一部分代码作为参考
private FileOutputStream fos;/*核心代码*/while(captureLogThreadOpen){ /* try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ try{ /*命令的准备*/ ArrayList<String> getLog = new ArrayList<String>(); getLog.add("logcat"); getLog.add("-d"); getLog.add("-v"); getLog.add("time"); ArrayList<String> clearLog = new ArrayList<String>(); clearLog.add("logcat"); clearLog.add("-c"); Process process = Runtime.getRuntime().exec(getLog.toArray(new String[getLog.size()]));//抓取当前的缓存日志 BufferedReader buffRead = new BufferedReader(new InputStreamReader(process.getInputStream()));//获取输入流 Runtime.getRuntime().exec(clearLog.toArray(new String[clearLog.size()]));//清除是为了下次抓取不会从头抓取 String str = null; logFile = new File(logPath+"log.txt");//打开文件 fos = new FileOutputStream(logFile,true);//true表示在写的时候在文件末尾追加 String newline = System.getProperty("line.separator");//换行的字符串 //Date date = new Date(System.currentTimeMillis()); //String time = format.format(date); //Log.i(TAG, "thread"); while((str=buffRead.readLine())!=null){//循环读取每一行 //Runtime.getRuntime().exec(clearLog.toArray(new String[clearLog.size()])); //Log.i(TAG, str); SimpleDateFormat format = new SimpleDateFormat("yyyy-"); Date date = new Date(System.currentTimeMillis()); String time = format.format(date); fos.write((time+str).getBytes());//加上年 fos.write(newline.getBytes());//换行 logCount++; if(logCount>10000){//大于10000行就退出 captureLogThreadOpen = false; captureLogThread = null; fos.close(); break; } } fos.close(); fos = null; Runtime.getRuntime().exec(clearLog.toArray(new String[clearLog.size()])); }catch(Exception e){ } }
我们通过str=buffRead.readLine()来读取日志的每一行数据,再通过fos.write((time+str).getBytes());写入到文件中。
4.注意事项
目前android中想要抓取日志,只允许获取系统及以上权限的apk才能进行这个操作,否则只能获得本app的logcat,因此,在抓取日志之前,最好使用签名工具对app进行签名获取系统权限
- Android学习之路------代码中获取Logcat打印日志并存放于文件中
- Android学习之路------代码中获取Logcat打印日志并存放于文件中
- Android代码中获取Logcat日志信息
- Android中Logcat日志打印不全解决办法
- android日志打印代码 logcat
- android logcat日志保存到文件中
- Android软件开发之在程序中时时获取logcat日志信息(三十三)
- Android软件开发之在程序中时时获取logcat日志信息
- Android软件开发之在程序中时时获取logcat日志信息
- Android软件开发之在程序中时时获取logcat日志信息(三十三)
- Android软件开发之在程序中时时获取logcat日志信息(三十三)
- Android软件开发之在程序中时时获取logcat日志信息
- JNI的native代码中打印日志到eclipse的logcat中
- JNI的native代码中打印日志到eclipse的logcat中
- JNI的native代码中打印日志到eclipse的logcat中
- JNI的native代码中打印日志到eclipse的logcat中
- JNI的native代码中打印日志到eclipse的logcat中
- 【小知识点总结】保存android日志logcat到文件中
- UE4 editor Camera speed setting
- 前台生成验证码
- Nginx搭建HTTPS服务器
- css使用总结
- c语言基础(2)--c语言概述
- Android学习之路------代码中获取Logcat打印日志并存放于文件中
- D - Ignatius and the Princess III(DP方法)
- servletContext
- AVL树插入删除
- .Net框架搭建之2、SQL Server MEF依赖注入 MVC Repository框架
- 如何使用fiddler2拦截移动端app的数组请求
- 适配——Drawable适配,占用内存测试
- Unity ScreenSpaceShadowMask Blur
- 第九章上传下载及其他