logcat日志在网页上的实时输出(环形日志缓冲区的实现)

发布时间:2020-06-21 21:48:56 作者:心如明镜
来源:网络 阅读:4160

    android手机上的logcat会不断的打印出日志。我们想要实现这样一个目标:在网页上显示某个手机的logcat打印信息,就像这样:

logcat日志在网页上的实时输出(环形日志缓冲区的实现)

因为是logcat是动态实时不断打印的,所以,不论多大的缓存都会被撑爆。所以,必须使用环形缓冲区,覆盖和重用日志缓冲区。如果日志打印过快,显然会出现新旧日志堆叠的问题。但常规情形下,使用环形日志缓冲区,都能收到比较好的实测效果。

接收日志的装置(里边放置环形缓冲容器logs,是一个列表,环形是通过放置逻辑实现的):

  1. public final class GetLogReceiver extends MultiLineReceiver { 
  2.      
  3.     // 五和:环形缓冲区的容量大小 
  4.     private static final int MAX_LOG_COUNT = 3000
  5.      
  6.     private List<String> logs; 
  7.      
  8.     private int writePos = 0
  9.      
  10.     public GetLogReceiver() { 
  11.         // 环形日志容器,留一条日志为空作为结束位置标识 
  12.         logs = new ArrayList<String>(MAX_LOG_COUNT); 
  13.          
  14.         for(int i=0; i<MAX_LOG_COUNT; i++) { 
  15.             logs.add(null); 
  16.         } 
  17.     } 
  18.  
  19.     @Override 
  20.     public boolean isCancelled() { 
  21.         return false
  22.     } 
  23.  
  24.     @Override 
  25.     public void processNewLines(String[] lines) { 
  26.         synchronized(logs) { 
  27.  
  28.             for(String line : lines) { 
  29.                 if(!line.trim().equals("")) { 
  30.                     logs.set(writePos, line); 
  31.                     writePos++; 
  32.                     writePos = writePos % MAX_LOG_COUNT; 
  33.                 } 
  34.             } 
  35.              
  36.             logs.set(writePos, null); 
  37.         } 
  38.     } 
  39.  
  40.     public List<String> getNextBatchLogs(int start, int count) { 
  41.         List<String> result = new ArrayList<String>(); 
  42.          
  43.         synchronized(logs) { 
  44.             int firstReadPos = start % MAX_LOG_COUNT; 
  45.              
  46.             for(int i=0; i<count; i++) { 
  47.                 readPos = (firstReadPos + i)%MAX_LOG_COUNT; 
  48.                 if (logs.get(readPos) != null) { 
  49.                     result.add(logs.get(readPos)); 
  50.                 } else { 
  51.                     break
  52.                 } 
  53.             } 
  54.         } 
  55.          
  56.         return result; 
  57.     } 

getNextBatchLogs提供了2个参数,一个是start,一个是count,前者表示网页开始读取日志的位置,后者表示网页想要读取日志的条数。通过这两个参数,网页可以通过ajax前向获取日志内容。

运行logcat的线程(核心代码):

  1. public void run() { 
  2.             while(true) { 
  3.                 try { 
  4.                     String serialNumber = device.getSerialNumber(); 
  5.                     String runLogcatCmd = "logcat -v time"
  6.                     device.executeShellCommand(runLogcatCmd, 
  7.                             LogReceiverManager.getInstance().getLogReceiver(serialNumber)); 
  8.                 } catch (TimeoutException e) { 
  9.                     e.printStackTrace(); 
  10.                 } catch (AdbCommandRejectedException e) { 
  11.                     // 五和:表明手机被拔掉了 
  12.                     break
  13.                 } catch (IOException e) { 
  14.                     // 五和:adb不稳定会抛此异常 
  15.                     break
  16.                 } catch (ShellCommandUnresponsiveException e) { 
  17.                     e.printStackTrace(); 
  18.                 } 
  19.                  
  20.                 // 每间隔1秒重试一次 
  21.                 try { 
  22.                     Thread.sleep(1000); 
  23.                 } catch (InterruptedException e) { 
  24.                     e.printStackTrace(); 
  25.                 } 
  26.                  
  27.                 if (isKilled) { 
  28.                     break
  29.                 } 
  30.             } 
  31.         } 

这里,通过LogReceiverManager给每个手机维护一个日志缓存装置,通过serialNumber可以获取到GetLogReceiver对象。

原理很简单,实现还是有点精巧的,因为代码并不多,效果比较好。此logcat实时打印的功能,百度的MTC貌似现在还未提供。

推荐阅读:
  1. Nginx日志自定义记录以及启用日志缓冲区详解
  2. nodejs实现日志读取、日志查找及日志刷新的方法分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

缓冲区 logcat 环形日志

上一篇:Storm安装与配置

下一篇:微信apk微信直接用手机默认浏览器打开 IOS跳转App S

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》