博客> 微信终端跨平台组件 Mars 系列 - 日志模块XLog
微信终端跨平台组件 Mars 系列 - 日志模块XLog
2017-11-22 01:14 评论:0 阅读:669 lvhahaha
日志XLog Mars

一、前言 mars 是微信官方的终端基础组件,是一个使用 C++ 编写的业务性无关,平台性无关的基础组件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。现正在筹备开源中,它主要包括以下几个部分: 1.comm:可以独立使用的公共库,包括 socket、线程、消息队列等 2.xlog:可以独立使用的日志模块 3.sdt:可以独立使用的网络诊断模块 4.stn:可以独立使用的信令分发网路模块

二、需求分析

但是现在由于项目需要,只是用到了XLog的日志统计功能。 对于移动开发者来说,最大的尴尬莫过于用户反馈程序出现问题,但因为不能重现且没有日志无法定位具体原因。这样看来客户端日志颇有点“养兵千日,用兵一时”的感觉,只有当出现问题且不容易重现时才能体现它的重要作用。为了保证关键时刻有日志可用,就需要保证程序整个生命周期内都要打日志,所以日志方案的选择至关重要。

1.日志的的log以及写入磁盘需要耗费大量的GC,当然会造成程序甚至UI的卡顿。所以在使用日志功能的时候不能影响程序的性能。最基本的保证是使用了日志不会导致程序卡顿。

2.因为要写入大量的 IO 导致程序卡顿,那是否可以先把日志缓存到内存中,当到一定大小时再加密写进文件,为了进一步减少需要加密和写入的数据,在加密之前可以先进行压缩。至于 Android 下存在频繁 GC 的问题,可以使用 C++ 来实现进行避免,而且通过 C++ 可以实现一个平台性无关的日志模块。 方案描述:把日志写入到作为 log 中间 buffer 的内存中,达到一定条件后压缩加密写进文件。 但是这样根据分析,如果程序crash的时候,crash 捕捉模块没有捕捉到导致部分时间点没有日志, 要保证程序整个生命周期内都有日志。所以这个方案会导致整个数据的不完整。

三、解决方案

XLog 所使用的方案是亟需一个既有直接写内存的性能,又有直接写文件的可靠性。 mmap

mmap 是使用逻辑内存对磁盘文件进行映射,中间只是进行映射没有任何拷贝操作,避免了写文件的数据拷贝。操作内存就相当于在操作文件,避免了内核空间和用户空间的频繁切换。

压缩

比较通用的压缩方案是先进行短语式压缩, 短语式压缩过程中有两个滑动窗口,历史滑动窗口和前向缓存窗口,在前向缓存窗口中通过和历史滑动窗口中的内容进行匹配从而进行编码。 我们只需要明白整个压缩过程中,短语式压缩也就是 LZ77 编码完成最大的压缩部分也是最重要的部分就行了,其他模块的压缩其实是对这个压缩结果的进一步压缩,进一步压缩的方式主要使用 huffman 压缩,所以这里就需要基于数字出现的频率进行统计编码,也就是说如果滑动窗口大小没上限的前提下,越多的数据集中压缩,压缩的效果就越好。日志模块使用这个方案时压缩效果可以达到 86.3%。

四、xlog 方案总结 使用流式方式对单行日志进行压缩,压缩加密后写进作为 log 中间 buffer的 mmap 中

虽然使用流式压缩并没有达到最理想的压缩率,但和 mmap 一起使用能兼顾流畅性 完整性 容错性 的前提下,83.7%的压缩率也是能接受的。使用这个方案,除非 IO 损坏或者磁盘没有可用空间,基本可以保证不会丢失任何一行日志。

mars 的日志模块 xlog 就是在兼顾这四点的前提下做到:高性能高压缩率、不丢失任何一行日志、避免系统卡顿和 CPU 波峰。

下节说明其使用方法。 完整文章地址:https://mp.weixin.qq.com/s/kDPTt9Rtd-PERXXW-UyUlQ Git地址: https://github.com/Tencent/mars

收藏
1
sina weixin mail 回到顶部