Logan:美团点评的开源移动端基础日志库
前言
Logan是美團(tuán)點(diǎn)評(píng)集團(tuán)移動(dòng)端基礎(chǔ)日志組件,這個(gè)名稱(chēng)是Log和An的組合,代表個(gè)體日志服務(wù)。同時(shí)Logan也是“金剛狼”大叔的名號(hào),當(dāng)然我們更希望這個(gè)產(chǎn)品能像金剛狼大叔一樣犀利。
Logan已經(jīng)穩(wěn)定迭代了一年多的時(shí)間。目前美團(tuán)點(diǎn)評(píng)絕大多數(shù)App已經(jīng)接入并使用Logan進(jìn)行日志收集、上傳、分析。近日,我們決定開(kāi)源Logan生態(tài)體系中的存儲(chǔ)SDK部分(Android/iOS),希望能夠幫助更多開(kāi)發(fā)者合理的解決移動(dòng)端日志存儲(chǔ)收集的相關(guān)痛點(diǎn),也歡迎更多社區(qū)的開(kāi)發(fā)者和我們一起共建Logan生態(tài)。Github的項(xiàng)目地址參見(jiàn):https://github.com/Meituan-Dianping/Logan
背景
隨著業(yè)務(wù)的不斷擴(kuò)張,移動(dòng)端的日志也會(huì)不斷增多。但業(yè)界對(duì)移動(dòng)端日志并沒(méi)有形成相對(duì)成體系的處理方式,在大多數(shù)情況下,還是針對(duì)不同的日志進(jìn)行單一化的處理,然后結(jié)合這些日志處理的結(jié)果再來(lái)定位問(wèn)題。然而,當(dāng)用戶達(dá)到一定量級(jí)之后,很多“疑難雜癥”卻無(wú)法通過(guò)之前的定位問(wèn)題的方式來(lái)進(jìn)行解決。移動(dòng)端開(kāi)發(fā)者最頭疼的事情就是“為什么我使用和用戶一模一樣的手機(jī),一模一樣的系統(tǒng)版本,仿照用戶的操作卻復(fù)現(xiàn)不出Bug”。特別是對(duì)于Android開(kāi)發(fā)者來(lái)說(shuō),手機(jī)型號(hào)、系統(tǒng)版本、網(wǎng)絡(luò)環(huán)境等都非常復(fù)雜,即使拿到了一模一樣的手機(jī)也復(fù)現(xiàn)不出Bug,這并不奇怪,當(dāng)然很多時(shí)候并不能完全拿到真正完全一模一樣的手機(jī)。相信很多同學(xué)見(jiàn)到下面這一幕都似曾相識(shí):
用(lao)戶(ban):我發(fā)現(xiàn)我們App的XX頁(yè)面打不開(kāi)了,UI展示不出來(lái),你來(lái)跟進(jìn)一下這個(gè)問(wèn)題。
你:好的。
于是,我們檢查了用戶反饋的機(jī)型和系統(tǒng)版本,然后找了一臺(tái)同型號(hào)同版本的手機(jī),試著復(fù)現(xiàn)卻發(fā)現(xiàn)一切正常。我們又給用戶打個(gè)電話,問(wèn)問(wèn)他到底是怎么操作的,再問(wèn)問(wèn)網(wǎng)絡(luò)環(huán)境,繼續(xù)嘗試復(fù)現(xiàn)依舊未果。最后,我們查了一下Crash日志,網(wǎng)絡(luò)日志,再看看埋點(diǎn)日志(發(fā)現(xiàn)還沒(méi)報(bào)上來(lái))。
你內(nèi)心OS:奇怪了,也沒(méi)產(chǎn)生Crash,網(wǎng)絡(luò)也是通的,但是為什么UI展示不出來(lái)呢?
幾個(gè)小時(shí)后……
用(lao)戶(ban):這問(wèn)題有結(jié)果了嗎?
你:我用了各種辦法復(fù)現(xiàn)不出來(lái)……暫時(shí)查不到是什么原因?qū)е碌倪@個(gè)問(wèn)題。
用(lao)戶(ban):那怪我咯?
你:……
如果把一次Bug的產(chǎn)生看作是一次“兇案現(xiàn)場(chǎng)”,開(kāi)發(fā)者就是破案的“偵探”。案發(fā)之后,偵探需要通過(guò)各種手段搜集線索,推理出犯案過(guò)程。這就好比開(kāi)發(fā)者需要通過(guò)查詢各種日志,分析這段時(shí)間App在用戶手機(jī)里都經(jīng)歷了什么。一般來(lái)說(shuō),傳統(tǒng)的日志搜集方法存在以下缺陷:
- 日志上報(bào)不及時(shí)。由于日志上報(bào)需要網(wǎng)絡(luò)請(qǐng)求,對(duì)于移動(dòng)App來(lái)說(shuō)頻繁網(wǎng)絡(luò)請(qǐng)求會(huì)比較耗電,所以日志SDK一般會(huì)積累到一定程度或者一定時(shí)間后再上報(bào)一次。
- 上報(bào)的信息有限。由于日志上報(bào)網(wǎng)絡(luò)請(qǐng)求的頻次相對(duì)較高,為了節(jié)省用戶流量,日志通常不會(huì)太大。尤其是網(wǎng)絡(luò)日志等這種實(shí)時(shí)性較高的日志。
- 日志孤島。不同類(lèi)型的日志上報(bào)到不同的日志系統(tǒng)中,相對(duì)孤立。
- 日志不全。日志種類(lèi)越來(lái)越多,有些日志SDK會(huì)對(duì)上報(bào)日志進(jìn)行采樣。
面臨挑戰(zhàn)
美團(tuán)點(diǎn)評(píng)集團(tuán)內(nèi)部,移動(dòng)端日志種類(lèi)已經(jīng)超過(guò)20種,而且隨著業(yè)務(wù)的不斷擴(kuò)張,這一數(shù)字還在持續(xù)增加。特別是上文中提到的三個(gè)缺陷,也會(huì)被無(wú)限地進(jìn)行放大。
查問(wèn)題是個(gè)苦力活,不一定所有的日志都上報(bào)在一個(gè)系統(tǒng)里,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),可能需要在多個(gè)系統(tǒng)中查看不同種類(lèi)的日志,這大大增加了開(kāi)發(fā)者定位問(wèn)題的成本。如果我們每天上班都看著疑難Bug掛著無(wú)法解決,確實(shí)會(huì)很難受。這就像一個(gè)偵探遇到了疑難的案件,當(dāng)他用盡各種手段收集線索,依然一無(wú)所獲,那種心情可想而知。我們收集日志復(fù)現(xiàn)用戶Bug的思路和偵探破案的思路非常相似,通過(guò)搜集的線索盡可能拼湊出相對(duì)完整的犯案場(chǎng)景。如果按照這個(gè)思路想下去,目前我們并沒(méi)有什么更好的方法來(lái)處理這些問(wèn)題。
不過(guò),雖然偵探破案和開(kāi)發(fā)者查日志解決問(wèn)題的思路很像,但實(shí)質(zhì)并不一樣。我們處理的是Bug,不是真實(shí)的案件。換句話說(shuō),因?yàn)槲覀兊摹八勒摺笔强梢?jiàn)的,那么就可以從它身上獲取更多信息,甚至和它進(jìn)行一次“靈魂的交流”。換個(gè)思路想,以往的操作都是通過(guò)各種各樣的日志拼湊出用戶出現(xiàn)Bug的場(chǎng)景,那可不可以先獲取到用戶在發(fā)生Bug的這段時(shí)間產(chǎn)生的所有日志(不采樣,內(nèi)容更詳細(xì)),然后聚合這些日志分析出(篩除無(wú)關(guān)項(xiàng))用戶出現(xiàn)Bug的場(chǎng)景呢?
個(gè)案分析
新的思路重心從“日志”變?yōu)椤坝脩簟?#xff0c;我們稱(chēng)之為“個(gè)案分析”。簡(jiǎn)單來(lái)說(shuō),傳統(tǒng)的思路是通過(guò)搜集散落在各系統(tǒng)的日志,然后拼湊出問(wèn)題出現(xiàn)的場(chǎng)景,而新的思路是從用戶產(chǎn)生的所有日志中聚合分析,尋找出現(xiàn)問(wèn)題的場(chǎng)景。為此,我們進(jìn)行了技術(shù)層面的嘗試,而新的方案需要在功能上滿足以下條件:
- 支持多種日志收集,統(tǒng)一底層日志協(xié)議,抹平日志種類(lèi)帶來(lái)的差異。
- 日志本地記錄,在需要時(shí)上報(bào),盡可能保證日志不丟失。
- 日志內(nèi)容要盡可能詳細(xì),不采樣。
- 日志類(lèi)型可擴(kuò)展,可由上層自定義。
我們還需要在技術(shù)上滿足以下條件:
- 輕量級(jí),包體盡量小
- API易用
- 沒(méi)有侵入性
- 高性能
最佳實(shí)踐
在這種背景下,Logan橫空出世,其核心體系由四大模塊構(gòu)成:
- 日志輸入
- 日志存儲(chǔ)
- 后端系統(tǒng)
- 前端系統(tǒng)
日志輸入
常見(jiàn)的日志類(lèi)型有:代碼級(jí)日志、網(wǎng)絡(luò)日志、用戶行為日志、崩潰日志、H5日志等。這些都是Logan的輸入層,在不影響原日志體系功能的情況下,可將內(nèi)容往Logan中存儲(chǔ)一份。Logan的優(yōu)勢(shì)在于:日志內(nèi)容可以更加豐富,寫(xiě)入時(shí)可以攜帶更多信息,也沒(méi)有日志采樣,只會(huì)等待合適的時(shí)機(jī)進(jìn)行統(tǒng)一上報(bào),能夠節(jié)省用戶的流量和電量。
以網(wǎng)絡(luò)日志為例,正常情況下網(wǎng)絡(luò)日志只記錄端到端延時(shí)、發(fā)包大小、回包大小字段等等,同時(shí)存在采樣。而在Logan中網(wǎng)絡(luò)日志不會(huì)被采樣,除了上述內(nèi)容還可以記錄請(qǐng)求Headers、回包Headers、原始Url等信息。
日志存儲(chǔ)
Logan存儲(chǔ)SDK是這個(gè)開(kāi)源項(xiàng)目的重點(diǎn),它解決了業(yè)界內(nèi)大多數(shù)移動(dòng)端日志庫(kù)存在的幾個(gè)缺陷:
- 卡頓,影響性能
- 日志丟失
- 安全性
- 日志分散
Logan自研的日志協(xié)議解決了日志本地聚合存儲(chǔ)的問(wèn)題,采用“先壓縮再加密”的順序,使用流式的加密和壓縮,避免了CPU峰值,同時(shí)減少了CPU使用。跨平臺(tái)C庫(kù)提供了日志協(xié)議數(shù)據(jù)的格式化處理,針對(duì)大日志的分片處理,引入了MMAP機(jī)制解決了日志丟失問(wèn)題,使用AES進(jìn)行日志加密確保日志安全性。Logan核心邏輯都在C層完成,提供了跨平臺(tái)支持的能力,在解決痛點(diǎn)問(wèn)題的同時(shí),也大大提升了性能。
為了節(jié)約用戶手機(jī)空間大小,日志文件只保留最近7天的日志,過(guò)期會(huì)自動(dòng)刪除。在Android設(shè)備上Logan將日志保存在沙盒中,保證了日志文件的安全性。
詳情請(qǐng)參考:美團(tuán)點(diǎn)評(píng)移動(dòng)端基礎(chǔ)日志庫(kù)——Logan
后端系統(tǒng)
后端是接收和處理數(shù)據(jù)中心,相當(dāng)于Logan的大腦。主要有四個(gè)功能:
- 接收日志
- 日志解析歸檔
- 日志分析
- 數(shù)據(jù)平臺(tái)
接收日志
客戶端有兩種日志上報(bào)的形式:主動(dòng)上報(bào)和回?fù)粕蠄?bào)。主動(dòng)上報(bào)可以通過(guò)客服引導(dǎo)用戶上報(bào),也可以進(jìn)行預(yù)埋,在特定行為發(fā)生時(shí)進(jìn)行上報(bào)(例如用戶投訴)。回?fù)粕蠄?bào)是由后端向客戶端發(fā)起回?fù)浦噶?#xff0c;這里不再贅述。所有日志上報(bào)都由Logan后端進(jìn)行接收。
日志解析歸檔
客戶端上報(bào)的日志經(jīng)過(guò)加密和壓縮處理,后端需要對(duì)數(shù)據(jù)解密、解壓還原,繼而對(duì)數(shù)據(jù)結(jié)構(gòu)化歸檔存儲(chǔ)。
日志分析
不同類(lèi)型日志由不同的字段組合而成,攜帶著各自特有信息。網(wǎng)絡(luò)日志有請(qǐng)求接口名稱(chēng)、端到端延時(shí)、發(fā)包大小、請(qǐng)求Headers等信息,用戶行為日志有打開(kāi)頁(yè)面、點(diǎn)擊事件等信息。對(duì)所有的各類(lèi)型日志進(jìn)行分析,把得到的信息串連起來(lái),最終匯集形成一個(gè)完整的個(gè)人日志。
數(shù)據(jù)平臺(tái)
數(shù)據(jù)平臺(tái)是前端系統(tǒng)及第三方平臺(tái)的數(shù)據(jù)來(lái)源,因?yàn)閭€(gè)人日志屬于機(jī)密數(shù)據(jù),所以數(shù)據(jù)獲取有著嚴(yán)格的權(quán)限審核流程。同時(shí)數(shù)據(jù)平臺(tái)會(huì)收集過(guò)往的Case,抽取其問(wèn)題特征記錄解決方案,為新Case提供建議。
前端系統(tǒng)
一個(gè)優(yōu)秀的前端分析系統(tǒng)可以快速定位問(wèn)題,提高效率。研發(fā)人員通過(guò)Logan前端系統(tǒng)搜索日志,進(jìn)入日志詳情頁(yè)查看具體內(nèi)容,從而定位問(wèn)題,解決問(wèn)題。
目前集團(tuán)內(nèi)部的Logan前端日志詳情頁(yè)已經(jīng)具備以下功能:
- 日志可視化。所有的日志都經(jīng)過(guò)結(jié)構(gòu)化處理后,按照時(shí)間順序展示。
- 時(shí)間軸。數(shù)據(jù)可視化,利用圖形方式進(jìn)行語(yǔ)義分析。
- 日志搜索。快速定位到相關(guān)日志內(nèi)容。
- 日志篩選。支持多類(lèi)型日志,可選擇需要分析的日志。
- 日志分享。分享單條日志后,點(diǎn)開(kāi)分享鏈接自動(dòng)定位到分享的日志位置。
Logan對(duì)日志進(jìn)行數(shù)據(jù)可視化時(shí),嘗試?yán)脠D形方式進(jìn)行語(yǔ)義分析簡(jiǎn)稱(chēng)為時(shí)間軸。
每行代表著一種日志類(lèi)型。同一日志類(lèi)型有著多種圖形、顏色,他們標(biāo)識(shí)著不同的語(yǔ)義。
例如時(shí)間軸中對(duì)代碼級(jí)日志進(jìn)行了日志類(lèi)別的區(qū)分:
利用顏色差異,可以輕松區(qū)分出錯(cuò)誤的日志,點(diǎn)擊紅點(diǎn)即可直接跳轉(zhuǎn)至錯(cuò)誤日志詳情。
個(gè)案分析流程
- 用戶遇到問(wèn)題聯(lián)系客服反饋問(wèn)題。
- 客服收到用戶反饋。記錄Case,整理問(wèn)題,同時(shí)引導(dǎo)用戶上報(bào)Logan日志。
- 研發(fā)同學(xué)收到Case,查找Logan日志,利用Logan系統(tǒng)完成日志篩選、時(shí)間定位、時(shí)間軸等功能,分析日志,進(jìn)而還原Case“現(xiàn)場(chǎng)”。
- 最后,結(jié)合代碼定位問(wèn)題,修復(fù)問(wèn)題,解決Case。
定位問(wèn)題
結(jié)合用戶信息,通過(guò)Logan前端系統(tǒng)查找用戶的日志。打開(kāi)日志詳情,首先使用時(shí)間定位功能,快速跳轉(zhuǎn)到出問(wèn)題時(shí)的日志,結(jié)合該日志上下文,可得到當(dāng)時(shí)App運(yùn)行情況,大致推斷問(wèn)題發(fā)生的原因。接著利用日志篩選功能,查找關(guān)鍵Log對(duì)可能出問(wèn)題的地方逐一進(jìn)行排查。最后結(jié)合代碼,定位問(wèn)題。
當(dāng)然,在實(shí)際上排查中問(wèn)題比這復(fù)雜多,我們要反復(fù)查看日志、查看代碼。這時(shí)還可能要借助一下Logan高級(jí)功能,如時(shí)間軸,通過(guò)時(shí)間軸可快速找出現(xiàn)異常的日志,點(diǎn)擊時(shí)間軸上的圖標(biāo)可跳轉(zhuǎn)到日志詳情。通過(guò)網(wǎng)絡(luò)日志中的Trace信息,還可以查看該請(qǐng)求在后臺(tái)服務(wù)詳細(xì)的響應(yīng)棧情況和后臺(tái)響應(yīng)值。
未來(lái)規(guī)劃
- 機(jī)器學(xué)習(xí)分析。首先收集過(guò)往的Case及解決方案,提取分析Case特征,將Case結(jié)構(gòu)化后入庫(kù),然后通過(guò)機(jī)器學(xué)習(xí)快速分析上報(bào)的日志,指出日志中可能存在的問(wèn)題,并給出解決方案建議;
- 數(shù)據(jù)開(kāi)放平臺(tái)。業(yè)務(wù)方可以通過(guò)數(shù)據(jù)開(kāi)放平臺(tái)獲取數(shù)據(jù),再結(jié)合自身業(yè)務(wù)的特性研發(fā)出適合自己業(yè)務(wù)的工具、產(chǎn)品。
平臺(tái)支持
| Support | ? | ? | ? | ? |
目前Logan SDK已經(jīng)支持以上四個(gè)平臺(tái),本次開(kāi)源iOS和Android平臺(tái),其他平臺(tái)未來(lái)將會(huì)陸續(xù)進(jìn)行開(kāi)源,敬請(qǐng)期待。
測(cè)試覆蓋率
由于Travis、Circle對(duì)Android NDK環(huán)境支持不夠友好,Logan為了兼容較低版本的Android設(shè)備,目前對(duì)NDK的版本要求是16.1.4479499,所以我們并沒(méi)有在Github倉(cāng)庫(kù)中配置CI。開(kāi)發(fā)者可以本地運(yùn)行測(cè)試用例,測(cè)試覆蓋率可達(dá)到80%或者更高。
開(kāi)源計(jì)劃
在集團(tuán)內(nèi)部已經(jīng)形成了以Logan為中心的個(gè)案分析生態(tài)系統(tǒng)。本次開(kāi)源的內(nèi)容有iOS、Android客戶端模塊、數(shù)據(jù)解析簡(jiǎn)易版,小程序版本、Web版本已經(jīng)在開(kāi)源的路上,后臺(tái)系統(tǒng),前端系統(tǒng)也在我們開(kāi)源計(jì)劃之中。
未來(lái)我們會(huì)提供基于Logan大數(shù)據(jù)的數(shù)據(jù)平臺(tái),包含機(jī)器學(xué)習(xí)、疑難日志解決方案、大數(shù)據(jù)特征分析等高級(jí)功能。
最后,我們希望提供更加完整的一體化個(gè)案分析生態(tài)系統(tǒng),也歡迎大家給我們提出建議,共建社區(qū)。
| iOS | ? | ||
| Android | ? | ||
| Web | ? | ||
| Mini Programs | ? | ||
| Back End | ? | ||
| Front End | ? |
作者簡(jiǎn)介
- 周輝,項(xiàng)目發(fā)起人,美團(tuán)點(diǎn)評(píng)資深移動(dòng)架構(gòu)師。
- 姜騰,項(xiàng)目核心開(kāi)發(fā)者。
- 立成,項(xiàng)目核心開(kāi)發(fā)者。
- 白帆,項(xiàng)目核心開(kāi)發(fā)者。
招聘信息
點(diǎn)評(píng)平臺(tái)移動(dòng)研發(fā)中心,Base上海,為美團(tuán)點(diǎn)評(píng)集團(tuán)大多數(shù)移動(dòng)端提供底層基礎(chǔ)設(shè)施服務(wù),包含網(wǎng)絡(luò)通信、移動(dòng)監(jiān)控、推送觸達(dá)、動(dòng)態(tài)化引擎、移動(dòng)研發(fā)工具等。同時(shí)團(tuán)隊(duì)還承載流量分發(fā)、UGC、內(nèi)容生態(tài)、整合中心等業(yè)務(wù)研發(fā),長(zhǎng)年虛位以待有志于專(zhuān)注移動(dòng)端研發(fā)的各路英雄。歡迎投遞簡(jiǎn)歷:hui.zhou#dianping.com。
總結(jié)
以上是生活随笔為你收集整理的Logan:美团点评的开源移动端基础日志库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 快手高级Java四轮面试题:设计模式+红
- 下一篇: 根因分析初探:一种报警聚类算法在业务系统