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