Zookeeper中如何解決zookeeper.out文件輸出位置問題
使用過 Zookeeper 的小伙伴都知道,Zookeeper 中運(yùn)行日志 zookeeper.out 文件的輸出路徑默認(rèn)為啟動腳本的當(dāng)前路徑,導(dǎo)致Zookeeper 集群啟動失敗想看日志時總是不記得輸出日志在哪兒,不方便查看日志文件,所以需要修改日志輸出位置及方式,方便查看日志。
具體操作如下:
注釋:以下所用 $ZOOKEEPER_HOME 為 Zookeeper 的根目錄
修改 $ZOOKEEPER_HOME/bin/zkEnv.sh 文件
將 ZOO_LOG_DIR 設(shè)置成自定義路徑,本次設(shè)置為 ${ZOOKEEPER_PREFIX}/logs,其中 ZOOKEEPER_PREFIX 變量是此腳本開頭獲取的 Zookeeper 的 bin 路徑,我們直接以此來定位自己的日志路徑即可。
具體如下:
# 修改前 if [ "x${ZOO_LOG_DIR}" = "x" ] then ? ? ZOO_LOG_DIR="." fi # 修改后 if [ "x${ZOO_LOG_DIR}" = "x" ] then # ? ?ZOO_LOG_DIR="." ? ? # 自定義運(yùn)行日志文件輸出路徑 ? ? ZOO_LOG_DIR="${ZOOKEEPER_PREFIX}/logs" fi
將日志文件寫到 Zookeeper 安裝目錄下的 logs 文件夾中(logs 不需要創(chuàng)建,它會自己創(chuàng)建)。
這樣在每次使用 zkSever.sh 的時候,都能將運(yùn)行日志 zookeeper.out 輸出到指定路徑下,但這樣配置有個問題,就是每次運(yùn)行 Zookeeper 時,此日志都會被覆蓋,而不是 append 到文件中,故每次運(yùn)行結(jié)束后只會保存有本次運(yùn)行日志,若單次運(yùn)行時間很長也會導(dǎo)致日志文件也很大。
修改 $ZOOKEEPER_HOME/conf/log4j.properties 文件
在之前的配置中,我們只是實(shí)現(xiàn)了保存本次Zookeeper運(yùn)行日志在指定路徑下,這次我們通過配置 $ZOOKEEPER_HOME/conf/log4j.properties 來使用 log4j 日志框架將 Zookeeper 每次的運(yùn)行日志都保存到指定路徑下。
修改其中的 zookeeper.root.logger、zookeeper.log.dir 這兩個參數(shù)。
具體如下:
# 修改前 zookeeper.root.logger=INFO, CONSOLE zookeeper.log.dir=. # 修改后 zookeeper.root.logger=INFO, CONSOLE, ROLLINGFILE zookeeper.log.dir=/opt/module/zookeeper-3.4.10/logs
其中參數(shù) zookeeper.root.logger 是設(shè)置日志優(yōu)先級和打印方式,默認(rèn)為控制臺打印 CONSOLE,而在 zkServer.sh 中會啟動后臺命令,將控制臺輸出的日志輸出重定向到 zookeeper.out 文件中。
修改后添加了滾動產(chǎn)生文件輸出方式 ROLLINGFILE;通過參數(shù) zookeeper.log.dir 設(shè)置日志文件 zookeeper.log 的存儲路徑,這里直接采用絕對路徑,相對路徑可能不識別;默認(rèn)日志文件名為 zookeeper.log,其中所有參數(shù)都可以自定義修改。其余參數(shù)不再贅述。
修改 $ZOOKEEPER_HOME/bin/zkEnv.sh 文件
這里為什么又要修改 zkEnv.sh 文件呢?
因為 zkEnv.sh 文件中也有 log 文件的輸出位置及方式,所以我們要將其中的 ZOO_LOG4J_PROP 設(shè)置成與 log4j 配置文件中相同,避免參數(shù)覆蓋。
具體如下:
# 修改前 if [ "x${ZOO_LOG4J_PROP}" = "x" ] then ? ? ZOO_LOG4J_PROP="INFO,CONSOLE" fi # 修改后 if [ "x${ZOO_LOG4J_PROP}" = "x" ] then # ? ?ZOO_LOG4J_PROP="INFO,CONSOLE" ? ? #自定義運(yùn)行日志信息輸出方式,增加了滾動輸出的方式,初始只有控制臺輸出 ? ? ZOO_LOG4J_PROP="INFO,CONSOLE,ROLLINGFILE" fi
修改 $ZOOKEEPER_HOME/bin/zkServer.sh 文件
完成以上配置就可以將日志文件按照自己想要的方式輸出,唯一美中不足的是在你設(shè)定的目錄中,仍會有 zookeeper.out 文件存在, 雖然它的 size=0,究其原因是因為 zkServer.sh 會使用 nohup 進(jìn)行 Zookeeper 的啟動,然而 nohup 必然會輸出一個日志文件到你設(shè)置的目錄中,所以修改 _ZOO_DAEMON_OUT 此處的邏輯修改掉, 就可以將zookeeper.out了。
具體如下:
#修改前 _ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out" #修改后 _ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.log"
修改 $ZOOKEEPER_HOME/conf/log4j.properties 文件
上述日志配置是以日志文件大小輪轉(zhuǎn)的,如果想要按照天輪轉(zhuǎn),可以將 log4j.appender.ROLLINGFILE 修改為 DaliyRollingFileAppender。
通過參數(shù) log4j.appender.ROLLINGFILE.MaxBackupIndex 設(shè)置最大日志數(shù)量,每個日志文件大小最大默認(rèn)為 10MB,以此文件大小進(jìn)行分割。
具體如下:
# 修改前 log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender #log4j.appender.ROLLINGFILE.MaxBackupIndex=10 # 修改后 log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.ROLLINGFILE.MaxBackupIndex=10
DailyRollingFileAppender特點(diǎn)是固定周期時間生成一個日志文件,比如,默認(rèn)情況是每天生成一個文件。
這種日志可以方便根據(jù)時間來定位日志位置,使日志清晰易查。但是這種日志有個不好地方是,不能限制日志數(shù)量,MaxBackupIndex 屬性和 MaxFileSize 在DailyRollingFileAppender 中是無效的,這個還是按照自己的需求來定!
當(dāng)然還有其他一些參數(shù):
log4j.appender.ROLLINGFILE.File=zookeeper.log ## 按照什么頻率滾動文件:yyyy-MM(每月)、yyyy-ww(每周)、yyyy-MM-dd(每天)、yyyy-MM-dd-a(每半天)、yyyy-MM-dd-HH(每小時)、yyyy-MM-dd-HH-mm(每分鐘) ## 此處文件名為zookeeper.log.yyyy-MM-dd,最新文件名為zookeeper.log log4j.appender.ROLLINGFILE.DataPattern='.'yyyy-MM-dd log4j.appender.ROLLINGFILE.encoding=UTF-8 ## 是否啟動追加模式,默認(rèn)為true,false為覆蓋 log4j.appender.ROLLINGFILE.Append=false
補(bǔ)充
修改原始輸出邏輯,不再將本次運(yùn)行日志信息所有輸出到 zookeeper.out 中,而是使用log4j框架輸出到 zookeeper.log 中,便于管理。而 zookeeper.out 只用于輸出標(biāo)準(zhǔn)錯誤。
具體如下所示:
注意:要想實(shí)現(xiàn)此處操作,上述 _ZOO_DAEMON_OUT=“$ZOO_LOG_DIR/zookeeper.out” 不能修改為 _ZOO_DAEMON_OUT=“$ZOO_LOG_DIR/zookeeper.log”
# 修改前 141 ? ? nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ 142 ? ? -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & # 修改后: 將原始指令注釋,設(shè)置新的輸出邏輯,只將標(biāo)準(zhǔn)錯誤輸出到zookeeper.out中. 141 # ? ?nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ 142 # ? ?-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null & 143 ? ? nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \ 144 ? ? -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" 2> "$_ZOO_DAEMON_OUT" 1> /dev/null &
這樣就能保證歷史運(yùn)行日志都能輸出到指定文件夾中,并且不會因為運(yùn)行日志文件堆積造成負(fù)載點(diǎn)爆炸。
而標(biāo)準(zhǔn)錯誤都會輸出到 zookeeper.out 文件中,和運(yùn)行日志放置在同一文件夾中。
當(dāng)需要查看腳本命令錯誤時,可以查看 zookeeper.out 文件,當(dāng)需要查看程序錯誤時就查看 zookeeper.log 運(yùn)行日志文件。
需要注意的是:每次啟動 Zookeeper 時,都會覆蓋 zookeeper.out 文件,所以要做重啟處理時記得備份文件。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JSP頁面?zhèn)鲄⒊霈F(xiàn)中文亂碼的解決方案
這篇文章主要介紹了JSP頁面?zhèn)鲄⒊霈F(xiàn)中文亂碼的解決方案,非常實(shí)用,需要的朋友可以參考下2014-08-08使用dom4j解析xml文件,并轉(zhuǎn)出json格式問題
這篇文章主要介紹了使用dom4j解析xml文件,并轉(zhuǎn)出json格式問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Java?Hibernate中一對多和多對多關(guān)系的映射方式
Hibernate是一種Java對象關(guān)系映射框架,支持一對多和多對多關(guān)系的映射。一對多關(guān)系可以使用集合屬性和單向/雙向關(guān)聯(lián)來映射,多對多關(guān)系可以使用集合屬性和中間表來映射。在映射過程中,需要注意級聯(lián)操作、延遲加載、中間表的處理等問題2023-04-04JSON反序列化Long變Integer或Double的問題及解決
這篇文章主要介紹了JSON反序列化Long變Integer或Double的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Java高級架構(gòu)之FastDFS分布式文件集群詳解
這篇文章主要介紹了Java高級架構(gòu)之FastDFS分布式文件集群詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04