全棧必備 Log日志
Log日志,不論對開發(fā)者自身,還是對軟件系統(tǒng)乃至產(chǎn)品服務(wù)都是非常重要的事情。每個開發(fā)者都接觸過日志,以至于每個人對日志的了解都會有所不同。
什么是日志
日志是什么呢?老碼農(nóng)看來,日志是帶有明確時間標(biāo)記的信息數(shù)據(jù)記錄。
根據(jù)不同的使用場景和視角,日志的分類也多種多樣。針對生成日志的主體,如果是開發(fā)者,可以有工作或?qū)W習(xí)日志,如果是代碼,可以是程序日志。根據(jù)應(yīng)用程序的使用領(lǐng)域,可以有系統(tǒng)日志和應(yīng)用日志,還可以進(jìn)一步細(xì)分,例如消息日志,事件日志,數(shù)據(jù)庫日志等等。
記日志的方式
對于開發(fā)者而言,隨手記日志(筆記)是一個良好的工作習(xí)慣。將工作或?qū)W習(xí)中遇到的問題,解決方案,新的體會隨時記下來,日積月累,就可以逐漸形成自己的知識體系。作為一個Evernote 的深度用戶,老碼農(nóng)推薦使用Evernote,當(dāng)然有道云筆記之類的其他工具同樣有效。開發(fā)者自身的日志一般都是給自己看的,記錄工作或?qū)W習(xí)日志的方式因人而異,適合自己就好。
而程序代碼中的日志,多用于應(yīng)用中相關(guān)信息的跟蹤記錄,要便于其他開發(fā)者或者其他應(yīng)用程序使用,一般是由日志標(biāo)準(zhǔn)的。廣泛使用的日志記錄標(biāo)準(zhǔn)是RFC 5424(https://tools.ietf.org/html/rfc5424)中定義的syslog。 syslog標(biāo)準(zhǔn)能夠標(biāo)準(zhǔn)化系統(tǒng)生成,過濾,記錄和分析日志消息。例如,其中定義的日志重要等級是這樣的:
- Emergency: system is unusable
- Alert: action must be taken immediately
- Critical: critical conditions
- Error: error conditions
- Warning: warning conditions
- Notice: normal but significant condition
- Informational: informational messages
- Debug: debug-level messages
在實(shí)際應(yīng)用中,根據(jù)應(yīng)用場景,有可能不完全遵從RFC 5424, 但依然可以從各種各樣日志工具庫中看到他們的影子,參考《全棧的技術(shù)棧設(shè)想》,對于全棧必備的幾種編程語言而言,Java中的Log4j,Python 中的Logging, JavaScript 中的log4JS都是不錯的選擇,遺憾的是,老碼農(nóng)沒有在Objective C 中使用過較好的日志庫,還在用將nslog 寫入文件的方式記日志,在C/C++中到是曾經(jīng)用過log4CXX以及zlog。
在python 的世界里,有著這樣相對偏執(zhí)的說法,“以日志調(diào)試為榮,以單步跟蹤為恥”。雖然有矯枉過正的嫌疑,但充分說明了記log日志的重要性。
常見應(yīng)用中的日志
成熟的系統(tǒng)中都有著自己的日志子系統(tǒng),例如windows的系統(tǒng)日志,Linux的syslog,docker的容器日志等。這里簡要回顧一些常見后端服務(wù)中的日志:Nginx日志,mysql 日志 和 tomcat 日志。
Nginx日志主要分為兩種:訪問日志和錯誤日志。訪問日志主要記錄客戶端訪問Nginx的每一個請求,格式可以自定義。通過訪問日志,可以得到用戶地域來源、跳轉(zhuǎn)來源、使用終端、某個URL訪問量等相關(guān)信息。錯誤日志主要記錄客戶端訪問Nginx出錯時的日志,格式不支持自定義。通過錯誤日志,可以得到系統(tǒng)某個服務(wù)或server的性能瓶頸等。在分析nginx 日志時, 老碼農(nóng)目前比較喜歡的工具是goaccess.
Tomcat下相關(guān)的日志文件有Cataline引擎的日志文件,文件名catalina.日期.log;Tomcat下內(nèi)部代碼丟出的日志,文件名localhost.日期.log;Tomcat下默認(rèn)manager應(yīng)用日志,文件名manager.日期.log ;控制臺輸出的日志,Linux下默認(rèn)重定向到catalina.out ;通過Servlet.xml配置的Access日志,應(yīng)用程序以log4j.properties:${catalina.base}/logs/probe.log重定向的日志等等。 就分析工具而言,老碼農(nóng)目前覺得Awstats是個不錯的工具。
MySQL有以下幾種日志:
- 錯誤日志:記錄啟動、運(yùn)行或停止時出現(xiàn)的問題,一般也會記錄警告信息。
- 一般查詢?nèi)罩荆河涗浗⒌目蛻舳诉B接和執(zhí)行的語句。
- 慢查詢?nèi)罩荆河涗浰袌?zhí)行時間超過longquerytime秒的所有查詢或不使用索引的查詢,可以幫我們定位服務(wù)器性能問題。
- 二進(jìn)制日志:任何引起或可能引起數(shù)據(jù)庫變化的操作,主要用于復(fù)制和即時點(diǎn)恢復(fù)。
- 中繼日志:從主服務(wù)器的二進(jìn)制日志文件中復(fù)制而來的事件,并保存為的日志文件。
- 事務(wù)日志:記錄InnoDB等支持事務(wù)的存儲引擎執(zhí)行事務(wù)時產(chǎn)生的日志。
MySQL 中的日志不僅僅是跟蹤信息,而且成為了業(yè)務(wù)系統(tǒng)的一部分。就日志分析而言,老碼農(nóng)最喜歡的就是percona-toolkit了,尤其是其中的慢查詢分析工具pt-query-degist.
根據(jù)應(yīng)用中的日志,可以獲知系統(tǒng)中更有價值的信息,而且可以為自己的日志系統(tǒng)提供資糧。
日志分析平臺
對單應(yīng)用實(shí)體的日志分析,可以有一些非常不錯的工具,例如上面提到的pt,goaccess等等。但是,對于整個應(yīng)用系統(tǒng)而言,在工作流或任務(wù)鏈上的每個服務(wù)組件都會產(chǎn)生日志,那么如何分析整個業(yè)務(wù)系統(tǒng)的日志呢?
老碼農(nóng)覺得ELK是日志分析平臺的一個上佳選擇。ELK由Elasticsearch、Logstash和Kibana三部分組件組成:Elasticsearch是個開源分布式搜索引擎,它的特點(diǎn)是分布式,零配置,自動發(fā)現(xiàn),索引自動分片,索引副本機(jī)制,restful風(fēng)格接口,多數(shù)據(jù)源,自動搜索負(fù)載等。Kibana 是一個開源和免費(fèi)的工具,可以為 Logstash 和 ElasticSearch 提供日志分析結(jié)果的Web可視化界面,匯總、分析和搜索重要數(shù)據(jù)日志。Logstash是一個完全開源的工具,可以對各種日志進(jìn)行收集、分析,并將其存儲供,logstash 的工作示意圖如下:
在ELK方案中,logstash 進(jìn)行日志采集和預(yù)處理,ES 完成分布式檢索,Kibaba 做最終的分析結(jié)果可視化。隨之需求的變化, 基于ELK 之上還有很多變種,例如引進(jìn)Kafka消息隊(duì)列,增加Storm 實(shí)時分析等等,都使得基于日志的應(yīng)用實(shí)現(xiàn)更大的價值化。
更進(jìn)一步,會形成統(tǒng)一日志平臺,逐漸形成業(yè)務(wù)系統(tǒng)的一部分,例如支持?jǐn)?shù)據(jù)的最終一致性等等。連自己都沒想到,日志居然如此的豐富多彩,還有很多有趣的問題,例如日志的動態(tài)開關(guān)配置,日志傳輸中的準(zhǔn)實(shí)時性,寫日志的性能損耗等等。
綜上,log日志的紀(jì)錄和分析,不僅僅是一種全棧必備的技能,更是一種開發(fā)者的基本素養(yǎng)。
【本文來自51CTO專欄作者“老曹”的原創(chuàng)文章,作者微信公眾號:喔家ArchiSelf,id:wrieless-com】