在发布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 = "<html><head><title></title></head><body>%s <script type=\"text/javascript\">function myrefresh(){window.location.reload();window.scrollTo(0,document.body.scrollHeight);}setTimeout('myrefresh()',1000); </script></body></html>"
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 style="color:%s">%s %s: [%s] %s </div>' % (color, log['time'],log['level'], log['tag'], log['msg'])
stacks = log['stack'].split('\n')
strLog = strLog + ('<div color="%s">' % color)
for s in stacks:
strLog = strLog + ('<div>%s</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/