zookeeper日志各類日志簡介
zookeeper服務器會產生三類日志:事務日志、快照日志和log4j日志。
在zookeeper默認配置文件zoo.cfg(可以修改文件名)中有一個配置項dataDir,該配置項用於配置zookeeper快照日志和事務日志的存儲地址。在官方提供的默認參考配置文件zoo_sample.cfg中,只有dataDir配置項。其實在實際應用中,還可以為事務日志專門配置存儲地址,配置項名稱為dataLogDir,在zoo_sample.cfg中並未體現出來。在沒有dataLogDir配置項的時候,zookeeper默認將事務日志文件和快照日志文件都存儲在dataDir對應的目錄下。建議將事務日志(dataLogDir)與快照日志(dataLog)單獨配置,因為當zookeeper集群進行頻繁的數據讀寫操作是,會產生大量的事務日志信息,將兩類日志分開存儲會提高系統性能,而且,可以允許將兩類日志存在在不同的存儲介質上,減少磁盤壓力。log4j用於記錄zookeeper集群服務器運行日志,該日志的配置地址在conf/目錄下的log4j.properties文件中,該文件中有一個配置項為“zookeeper.log.dir=.”,表示log4j日志文件在與執行程序(zkServer.sh)在同一目錄下。當執行zkServer.sh 時,在該文件夾下會產生zookeeper.out日志文件。下面主要介紹事務日志與快照日志。
事務日志
事務日志指zookeeper系統在正常運行過程中,針對所有的更新操作,在返回客戶端“更新成功”的響應前,zookeeper會保證已經將本次更新操作的事務日志已經寫到磁盤上,只有這樣,整個更新操作才會生效。
根據上文所述,可以通過zoo.cfg文件中的dataLogDir配置項找到事物日志存儲地點:

在datalog/目錄下存在一個文件夾version-2,該文件夾中保存着事物日志文件:

從截圖中我們可以看出,日志文件的命名規則為log.**,文件大小為64MB,**表示寫入該日志的第一個事務的ID,十六進制表示。
事務日志可視化
zookeeper的事務日志為二進制文件,不能通過vim等工具直接訪問。其實可以通過zookeeper自帶的jar包讀取事務日志文件。
首先將libs中的slf4j-api-1.6.1.jar文件和zookeeper根目錄下的zookeeper-3.4.9.jar文件復制到臨時文件夾tmplibs中,然后執行如下命令:
Java -classpath .:slf4j-api-1.6.1.jar:zookeeper-3.4.9.jar org.apache.zookeeper.server.LogFormatter ../Data/datalog/version-2/log.1
執行后Terminal顯示如下(部分):

至於具體的含義,我也不清楚,需要了解的大神們請自行網上搜索解釋,很多^_^
快照日志
zookeeper的數據在內存中是以樹形結構進行存儲的,而快照就是每隔一段時間就會把整個DataTree的數據序列化后存儲在磁盤中,這就是zookeeper的快照文件。
zookeeper快照日志的存儲路徑同樣可以在zoo.cfg中查看,如上文截圖所示。訪問dataDir路徑可以看到version-2文件夾:
從截圖中可以看出,zookeeper快照文件的命名規則為snapshot.**,其中**表示zookeeper觸發快照的那個瞬間,提交的最后一個事務的ID。
快照日志可視化
日志清理
在zookeeper 3.4.0以后,zookeeper提供了自動清理snapshot和事務日志功能,通過配置zoo.cfg下的autopurge.snapRetainCount和autopurge.purgeInterval這兩個參數實現日志文件的定時清理。
autopurge.snapRetainCount這個參數指定了需要保留的文件數目,默認保留3個;
autopurge.purgeInterval這個參數指定了清理頻率,單位是小時,需要填寫一個1或者更大的數據,默認0表示不開啟自動清理功能。
