• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > ULog远程日志——让Android调试更加方便直观

ULog远程日志——让Android调试更加方便直观

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了ulog,ulog services co ltd,android log日志,android日志工具类,android studio 日志等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

ULog远程日志——让Android调试更加方便直观


在发布U8SDK之后,使用U8SDK做SDK接入的同学,反馈比较多的一个问题就是调试困难。这其实不是U8SDK的毛病,而是Android开发的通病。做Android开发,我们通常都是结合logcat来调试,如果是原生的应用,有时我们还可以直接通过Debug断点来调试,但是,做游戏开发,我们一般采用U3D,Cocos2dx游戏引擎开发之后,发布到对应的移动平台。所以,断点调试就不太好实现了。很多时候,我们都是打印一些日志,然后在logcat中定位对应的日志,来查找错误信息。

之前也一直是使用logcat,但是logcat中日志太多,过滤功能虽然有,但是有时候,有些机型,打印的日志太多,你还没有看清楚,日志就被各种系统日志给顶掉了。

而且,很多做游戏开发的同学,可能也是游戏快要做好了,要接各个平台的渠道SDK的时候,才开始接触Android开发。导致对logcat如何正确使用,就更找不到门路。

所以,我想干脆在原有日志的基础上,再加一个远程日志打印,再接将日志输出到网页上,这样日志方便搜索,也不用理会各种乱七八糟的系统日志。

然后,我们在U8SDK中将原有日志简单封装了下,让日志打印可以支持远程打印。远程打印,顾名思义,我们需要一个服务器端,来接收这些日志,并输出到网页上。

首先想到的是,用java写,部署到tomcat,但是想想,如此简单的一个逻辑,用java真是有点浪费不说,还有点臃肿。最后,因为U8SDK打包工具用python写的,那么想就用python搭建一个吧,了解了下python中搭建一个web服务器端,有几种框架可以使用,最终选择了一个最最简单的web.py框架,这个框架要实现我们这个功能,真是再合适不过了,轻量的不能再轻量了。

我们只需要实现两个功能接口, 一个是上报日志的接口,一个是显示日志的接口。上报日志,我们采用Http Post方式, 显示日志,采用Http Get浏览器中直接访问。

为了让不同级别的日志显示区别开来,我们给不同级别的日志,配上不同的颜色。

客户端上报的日志,先在内存中放着,网页上我们启动一段js代码,每隔1秒钟自动刷新一次,并将滚动位置,始终保持在最后。这样,我们的一个简单的日志收集和展示的web 服务器就好了,代码片段:

import json
import web

web.config.debug = False

urls = (
        '/','index'
    )

localLogs = ""


class index:

    def GET(self):

        htmlFormat = "
%s <script type=\"text/javascript\">function myrefresh(){window.location.reload();window.scrollTo(0,document.body.scrollHeight);}setTimeout('myrefresh()',1000); </script>" global localLogs localLogs = localLogs.encode('gbk') return htmlFormat % localLogs def POST(self): inputs=web.input() content = inputs.get('log') if content.startswith('{') and content.endswith('}'): content = '[' + content + ']' logs = json.loads(content) for log in logs: if 'stack' not in log: log['stack'] = " " color = '#808080' if log['level'] == 'INFO': color = '#008000' elif log['level'] == 'WARNING': color = '#FFA500' elif log['level'] == 'ERROR': color = '#FF0000' strLog = ' </div> ' % (color, log['time'],log['level'], log['tag'], log['msg']) stacks = log['stack'].split('\n') strLog = strLog + (' </div> ' % (s.strip())) strLog = strLog + '</div> ' global localLogs localLogs = localLogs + strLog return "" if __name__ == '__main__': app = web.application(urls, globals()) app.run()

上面这段代码,就是我们这个日志服务器的全部代码了,我们将这个文件保存为uconsole.py,然后,打开命令终端,运行:

python uconsole.py

这样,就可以启动该服务器了,默认监听的端口是8080。如果该端口被占用了,会启动失败,那么我们可以换一个端口

python uconsole.py 8082

这样,我们就变成监听8082这个端口了。你可以打开http:localhost:8082/ 你会发现网页是空白的,但是每隔一秒网页会自动刷新一下,说明当前服务器已经启动好了,正在等待日志的到来。

接下来,我们就要设计下客户端部分的日志框架,让日志以Http Post的方式上报到我们这个日志服务器端。

我们打算将Android原有的日志(com.android.util.Log)进行一个简单的封装,因为我们仅仅要加一个远程日志接口,所以,我们不希望把它弄得过于复杂。

我们定义一个ILog接口,将日志接口提取出来,这样,我们将会有这个两个实现,一个LocalLog,一个RemoteLog。LocalLog中,我们依然调用Android自带的Log进行打印,RemoteLog中,我们将日志放到一个队列中,每隔一定的间隔,就将存储的日志一次性上报到日志服务器。
ILog接口:

public interface ILog {

    public void d(String tag, String msg);
    public void i(String tag, String msg);
    public void w(String tag, String msg);
    public void w(String tag, String msg, Throwable e);
    public void e(String tag, String msg);
    public void e(String tag, String msg, Throwable e);

    public void destory();
}

ULocalLog实现:

/**
 * 
 * Android本地日志输出
 *
 */
public class ULocalLog implements ILog{

    @Override
    public void d(String tag, String msg) {
        Log.d(tag, msg);
    }

    @Override
    public void i(String tag, String msg) {
        Log.i(tag, msg);
    }

    @Override
    public void w(String tag, String msg) {
        Log.w(tag, msg);
    }

    @Override
    public void e(String tag, String msg) {
        Log.e(tag, msg);
    }

    @Override
    public void w(String tag, String msg, Throwable e) {
        Log.w(tag, msg, e);
    }

    @Override
    public void e(String tag, String msg, Throwable e) {
        Log.e(tag, msg, e);

    }

    @Override
    public void destory() {

    }

}

URemoteLog实现:

public class URemoteLog implements ILog{

    private URemoteLogPrinter printer;

    public URemoteLog(String url, int interval){
        printer = new URemoteLogPrinter(url, interval);
    }

    @Override
    public void d(String tag, String msg) {
        printer.print(new ULog(ULog.L_DEBUG, tag, msg));
    }

    @Override
    public void i(String tag, String msg) {
        printer.print(new ULog(ULog.L_INFO, tag, msg));
    }

    @Override
    public void w(String tag, String msg) {
        printer.print(new ULog(ULog.L_WARN, tag, msg));
    }

    @Override
    public void w(String tag, String msg, Throwable e) {
        printer.print(new ULog(ULog.L_WARN, tag, msg, e));
    }

    @Override
    public void e(String tag, String msg) {
        printer.print(new ULog(ULog.L_ERROR, tag, msg));
    }

    @Override
    public void e(String tag, String msg, Throwable e) {
        printer.print(new ULog(ULog.L_ERROR, tag, msg, e));
    }

    @Override
    public void destory() {
        printer.stop();
    }

}

远程日志实现中,我们采用一个URemoteLogPrinter来临时存储日志,并定时传到日志服务器,该类实现如下:

public class URemoteLogPrinter {

    private List logs;
    private String url;
    private int interval = 1000; //单位 毫秒

    private Timer timer;
    private boolean running;

    public URemoteLogPrinter(){

    }

    public URemoteLogPrinter(String remoteUrl, int interval){
        this.logs = Collections.synchronizedList(new ArrayList());
        this.url = remoteUrl;
        this.interval = interval;
    }

    public void print(ULog log){

        start();
        synchronized (logs) {
            logs.add(log);
        }
    }

    public void printImmediate(String url, ULog log){

        Map params = new HashMap();
        params.put("log", log.toJSON());
        U8HttpUtils.httpPost



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ULog远程日志——让Android调试更加方便直观

相关文章

  • 2017-05-26getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir(),mediacachefiles
  • 2017-05-26linux命令之tcpdump
  • 2017-05-26Android中Activity处理返回结果的实现方式,androidactivity
  • 2017-07-23从头开始学RecyclerView(六)LayoutManager
  • 2017-05-26android发送邮件
  • 2017-08-23Android 跳转到系统设置界面汇总
  • 2017-05-26greendao3.2.3配置时遇到的问题,greendao3.2.3遇到
  • 2017-05-26浅谈Android编码规范及命名规范,浅谈android编码规范
  • 2017-05-26【微学堂】第22期| Nginx的性能优化
  • 2017-05-26android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android的基本世界观——系统简介,组件逻辑及其他
    • Android中button点击后字体的变色效果,androidbutton
    • 关于linux的busybox工具mdev的使用和声卡热插拔以及驱动挂载的总结
    • TiemPicke 和 DatePicker控件 自定义大小
    • Android7.0 Phone应用源码分析(三) phone拒接流程分析,android7.0拒接
    • 【读书笔记】【Android 开发艺术探索】第3章 View 的事件体系
    • Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_
    • Android系统四层架构分享,android四层架构
    • 历代安卓版本回顾(使用者角度+开发者角度)长期更新!!!,安卓开发者
    • Android捕获崩溃异常,Android捕获崩溃

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有