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
















 
 
 











 
 
 
 