Log日志,不論對開發者自身,還是對軟體系統乃至産品服務都是非常重要的事情。每個開發者都接觸過日志,以至于每個人對日志的了解都會有所不同。
什麼是日志
日志是什麼呢?老碼農看來,日志是帶有明确時間标記的資訊資料記錄。
根據不同的使用場景和視角,日志的分類也多種多樣。針對生成日志的主體,如果是開發者,可以有工作或學習日志,如果是代碼,可以是程式日志。根據應用程式的使用領域,可以有系統日志和應用日志,還可以進一步細分,例如消息日志,事件日志,資料庫日志等等。
記日志的方式
對于開發者而言,随手記日志(筆記)是一個良好的工作習慣。将工作或學習中遇到的問題,解決方案,新的體會随時記下來,日積月累,就可以逐漸形成自己的知識體系。作為一個Evernote 的深度使用者,老碼農推薦使用Evernote,當然有道雲筆記之類的其他工具同樣有效。開發者自身的日志一般都是給自己看的,記錄工作或學習日志的方式因人而異,适合自己就好。
而程式代碼中的日志,多用于應用中相關資訊的跟蹤記錄,要便于其他開發者或者其他應用程式使用,一般是由日志标準的。廣泛使用的日志記錄标準是RFC 5424(https://tools.ietf.org/html/rfc5424)中定義的syslog。 syslog标準能夠标準化系統生成,過濾,記錄和分析日志消息。例如,其中定義的日志重要等級是這樣的:
0 Emergency: system is unusable
1 Alert: action must be taken immediately
2 Critical: critical conditions
3 Error: error conditions
4 Warning: warning conditions
5 Notice: normal but significant condition
6 Informational: informational messages
7 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有以下幾種日志:
- 錯誤日志:記錄啟動、運作或停止時出現的問題,一般也會記錄警告資訊。
- 一般查詢日志:記錄建立的用戶端連接配接和執行的語句。
- 慢查詢日志:記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢,可以幫我們定位伺服器性能問題。
- 二進制日志:任何引起或可能引起資料庫變化的操作,主要用于複制和即時點恢複。
- 中繼日志:從主伺服器的二進制日志檔案中複制而來的事件,并儲存為的日志檔案。
- 事務日志:記錄InnoDB等支援事務的存儲引擎執行事務時産生的日志。
MySQL 中的日志不僅僅是跟蹤資訊,而且成為了業務系統的一部分。就日志分析而言,老碼農最喜歡的就是percona-toolkit了,尤其是其中的慢查詢分析工具pt-query-degist.
根據應用中的日志,可以獲知系統中更有價值的資訊,而且可以為自己的日志系統提供資糧。