西安网站制作怎么联系,wordpress更新php,网站优化知识,咨询网站 模板背景 对于移动应用来说#xff0c;日志库是必不可少的基础设施#xff0c;美团点评集团旗下移动应用每天产生的众多种类的日志数据已经达到几十亿量级。为了解决日志模块普遍存在的效率、安全性、丢失日志等问题#xff0c;Logan基础日志库应运而生。 现存问题 目前#xf… 背景 对于移动应用来说日志库是必不可少的基础设施美团点评集团旗下移动应用每天产生的众多种类的日志数据已经达到几十亿量级。为了解决日志模块普遍存在的效率、安全性、丢失日志等问题Logan基础日志库应运而生。 现存问题 目前业内移动端日志库大多都存在以下几个问题 卡顿影响性能日志丢失安全性日志分散首先日志模块作为底层的基础库对上层的性能影响必须尽量小但是日志的写操作是非常高频的频繁在Java堆里操作数据容易导致GC的发生从而引起应用卡顿而频繁的I/O操作也很容易导致CPU占用过高甚至出现CPU峰值从而影响应用性能。 其次日志丢失的场景也很常见例如当用户的App发生了崩溃崩溃日志还来不及写入文件程序就退出了但本次崩溃产生的日志就会丢失。对于开发者来说这种情况是非常致命的因为这类日志丢失意味着无法复现用户的崩溃场景很多问题依然得不到解决。 第三点日志的安全性也是至关重要的绝对不能随意被破解成明文也要防止网络被劫持导致的日志泄漏。 最后一点对于移动应用来说日志肯定不止一种一般会包含端到端日志1、代码日志、崩溃日志、埋点日志这几种甚至会更多。不同种类的日志都具有各自的特点会导致日志比较分散查一个问题需要在各个不同的日志平台查不同的日志例如端到端日志还存在日志采样这无疑增加了开发者定位问题的成本。 面对美团点评几十亿量级的移动端日志处理场景这些问题会被无限放大最终可能导致日志模块不稳定、不可用。然而Logan应运而生漂亮地解决了上述问题。 简介 Logan名称是Log和An的组合代表个体日志服务的意思同时也是金刚狼大叔的大名。通俗点说Logan是美团点评移动端底层的基础日志库可以在本地存储各种类型的日志在需要时可以对数据进行回捞和分析。 Logan具备两个核心能力本地存储和日志捞取。作为基础日志库Logan已经接入了集团众多日志系统例如端到端日志、用户行为日志、代码级日志、崩溃日志等。作为移动应用的幕后英雄Logan每天都会处理几十亿量级的移动端日志。 设计 作为一款基础日志库在设计之初就必须考虑如何解决日志系统现存的一些问题。 卡顿影响性能 I/O是比较耗性能的操作写日志需要大量的I/O操作为了提升性能首先要减少I/O操作最有效的措施就是加缓存。先把日志缓存到内存中达到一定大小的时候再写入文件。为了减少写入本地的日志大小需要对数据进行压缩为了增强日志的安全性需要对日志进行加密。然而这样做的弊端是 对Android来说对日志加密压缩等操作全部在Java堆里面。由于日志写入是一个高频的动作频繁地堆内存操作容易引发Java的GC导致应用卡顿集中压缩会导致CPU短时间飙高出现峰值由于日志是内存缓存在杀进程、Crash的时候容易丢失内存数据从而导致日志丢失。Logan的解决方案是通过Native方式来实现日志底层的核心逻辑也就是C编写底层库。这样做不光能解决Java GC问题还做到了一份代码运行在Android和iOS两个平台上。同时在C层实现流式的压缩和加密数据可以减少CPU峰值使程序运行更加顺滑。而且先压缩再加密的方式压缩率比较高整体效率较高所以这个顺序不能变。 日志丢失 加缓存之后异常退出丢失日志的问题就必须解决Logan为此引入了MMAP机制。MMAP是一种内存映射文件的方法即将一个文件或者其它对象映射到进程的地址空间实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对应关系。MMAP机制的优势是 MMAP使用逻辑内存对磁盘文件进行映射操作内存就相当于操作文件经过测试发现操作MMAP的速度和操作内存的速度一样快可以用MMAP来做数据缓存MMAP将日志回写时机交给操作系统控制。如内存不足进程退出的时候操作系统会自动回写文件MMAP对文件的读写操作不需要页缓存只需要从磁盘到用户主存的一次数据拷贝过程减少了数据的拷贝次数提高了文件读写效率。引入MMAP机制之后日志丢失问题得到了有效解决同时也提升了性能。不过这种方式也不能百分百解决日志丢失的问题MMAP存在初始化失败的情况这时候Logan会初始化堆内存来做日志缓存。根据我们统计的数据来看MMAP初始化失败的情况仅占0.002%已经是一个小概率事件了。 安全性 日志文件的安全性必须得到保障不能随意被破解更不能明文存储。Logan采用了流式加密的方式使用对称密钥加密日志数据存储到本地。同时在日志上传时使用非对称密钥对对称密钥Key做加密上传防止密钥Key被破解从而在网络层保证日志安全。 日志分散 针对日志分散的情况为了保证日志全面需要做本地聚合存储。Logan采用了自研的日志协议对于不同种类的日志都会按照Logan日志协议进行格式化处理存储到本地。当需要上报的时候进行集中上报通过Logan日志协议进行反解还原出不同日志的原本面貌。同时Logan后台提供了聚合展示的能力全面展示日志内容根据协议综合各种日志进行分析使用时间轴等方式展示不同种日志的重要信息使得开发者只需要通过Logan平台就可以查询到某一段时间App到底产生了哪些日志可以快速复现问题场景定位问题并处理。 关于Logan平台是如何展示日志的下文会再进行说明。 架构 首先看一下Logan的整体架构图 Logan自研的日志协议解决了日志本地聚合存储的问题采用先压缩再加密的顺序使用流式的加密和压缩避免了CPU峰值同时减少了CPU使用。跨平台C库提供了日志协议数据的格式化处理针对大日志的分片处理引入了MMAP机制解决了日志丢失问题使用AES进行日志加密确保日志安全性并且提供了主动上报接口。Logan核心逻辑都在C层完成提供了跨平台支持的能力在解决痛点问题的同时也大大提升了性能。 日志分片 Logan作为日志底层库需要考虑上层传入日志过大的情况。针对这样的场景Logan会做日志分片处理。以20k大小做分片每个切片按照Logan的协议进行存储上报到Logan后台的时候再做反解合并恢复日志本来的面貌。 那么Logan是如何进行日志写入的呢下图为Logan写日志的流程 性能 为了检测Logan的性能优化效果我们专门写了测试程序进行对比读取16000行的日志文本间隔3ms依次调用写日志函数。 首先对比Java实现和C实现的内存状况 Java C 可以看出Java实现写日志GC频繁而C实现并不会出现这种情况因为它不会占用Java的堆内存。那么再对比一下Java实现和C实现的CPU使用情况 C实现没有频繁的GC同时采用流式的压缩和加密避免了集中压缩加密可能产生的CPU峰值所以CPU平均使用率会降低如上图所示。 特色功能 日志回捞 开发者可能都会遇到类似的场景某个用户手机上装了App出现了崩溃或者其它问题日志还没上报或者上报过程中被网络劫持发生日志丢失导致有些问题一直查不清原因或者没法及时定位到问题影响处理进程。依托集团PushSDK强大的推送能力Logan可以确保用户的本地日志在发出捞取指令后及时上传。通过网络类型和日志大小上限选择可以为用户最大可能的节省移动流量。 回馈机制可以确保捞取日志任务的进度得到实时展现。 日志回捞平台有着严格的审核机制确保开发者不会侵犯用户隐私只关注问题场景。 主动上报 Logan日志回捞依赖于Push透传。客户端被唤醒接收Push消息受到一些条件影响 Android想要后台唤醒App需要确保Push进程在后台存活iOS想要后台唤醒APP需要确保用户开启后台刷新开关网络环境太差Android上Push长连建立不成功。如果无法唤醒App只有在用户再次进入App时Push通道建立后才能收到推送消息以上是导致Logan日志回捞会有延迟或收不到的根本原因从分析可以看出Logan系统回捞的最大瓶颈在于Push系统。那么能否抛开Push系统得到Logan日志呢先来看一下使用日志回捞方式的典型场景 其中最大的障碍在于Push触达用户。那么主动上报的设计思路是怎样的呢 通过在App中主动调用上报接口用户直接上报日志的方式称之为Logan的主动上报。主动上报的优势非常明显跳过了Push系统让用户在需要的时候主动上报Logan日志开发者再也不用为不能及时捞到日志而烦恼在用户投诉之前就已经拿到日志便于更高效地分析解决问题。 线上效果 Logan基础日志库自2017年9月上线以来运行非常稳定大大提高了集团移动开发工程师分析日志、定位线上问题的效率。 Logan平台时间轴日志展示 Logan日志聚合详情展示 作为基础日志库Logan目前已经接入了集团众多日志系统 CAT端到端日志埋点日志用户行为日志代码级日志网络内部日志Push日志Crash崩溃日志现在Logan已经接入美团、大众点评、美团外卖、猫眼等众多App日志种类也更加丰富。 展望未来 H5 SDK 目前Logan只有移动端版本支持Android/iOS系统暂不支持H5的日志上报。对于纯JS开发的页面来说同样有日志分散、问题场景复现困难等痛点也迫切需要类似的日志底层库。我们计划统一H5和Native的日志底层库包括日志协议、聚合等Logan的H5 SDK也在筹备中。 日志分析 Logan平台的日志展示方式我们还在探索中。未来计划对日志做初步的机器分析与处理能针对某些关键路径给出一些分析结果让开发者更专注于业务问题的定位与分析同时希望分析出用户的行为是否存在风险、恶意请求等。 思考题 本文给大家讲述了美团点评移动端底层基础日志库Logan的设计、架构与特色Logan在解决了许多问题的同时也会带来新的问题。日志文件不能无限大目前Logan日志文件最大限制为10M遇到大于10M的情况应该如何处理最佳是丢掉前面的日志还是丢掉追加的日志还是做分片处理呢这是一个值得深思的问题。 作者简介 白帆美团点评基础框架研发组Android技术专家。2015年加入原大众点评。先后负责客户端长连网络SDK、Logan日志SDK等项目。目前主导Logan日志SDK的开发和推广。立成美团点评基础框架研发组Android高级开发工程师。2016年加入美团点评在Android开发、跨平台开发、移动端测试等领域有一定的实践经验热爱新技术并愿意付诸实践致力于产出高质量代码。招聘信息 点评平台移动研发中心base上海提供美团点评集团大多数移动端底层基础设施包含网络通信、移动监控、推送触达、动态化引擎、移动研发工具等。同时团队还承载流量分发UGC内容生态整合中心等业务研发长年虚位以待有志于专注移动端研发的各路英雄。欢迎投递简历hui.zhou#dianping.com。 解释说明 端到端end-to-end端到端是网络连接。网络要通信必须建立连接不管有多远中间有多少机器都必须在两头源和目的间建立连接一旦连接建立起来就说已经是端到端连接了。下文图中的CAT Log即端到端日志。 [return]