關於LOG那點事兒
日誌,作為記錄系統中硬件、軟件和系統問題的信息,同時還可以監視系統中發生的事件,是產品運維中非常重要的數據之一,用戶可以通過它來檢查錯誤發生的原因,或者尋找受到攻擊時攻擊者留下的痕跡。
日誌根據程序和不同領域,可分為消息日誌,事件日誌,數據庫日誌等等。
對於Java工程師而言,程序代碼的日誌是由工程師主動記錄的一類為跟蹤業務流程執行過程數據的日誌,但很多程序員其實並不知道,LOG也是有國際標準的:
Emergency: system is unusable Alert: action must be taken immediately Critical: critical conditions Error Warning: warning conditions Notice: normal but significant condition Informational: informational messages Debug: debug-level messages |
其中標粗部分是程序員常見的一些日誌等級,但在實際業務系統中,有可能不完全按照這個標準來定義日誌,比如Java中的Log4j就有自己的一套日誌等級體系。
在Java領域,其實有許多日誌是被大家忽略的,大家最熟知的可能就是控制臺日誌輸出了,其實從操作系統到數據庫的各個環節都會產生日誌,例如: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。
因此,日誌存在於我們構建系統的方方面面,而充分地分析和監控日誌,可以為系統的穩定運行與持續優化提供重要的情報來源,但日誌往往是被程序員忽略的一個點。
關於LOG那點事兒