ZooKeeper日誌配置

  • 2019 年 11 月 26 日
  • 筆記

1. 簡介

ZooKeeper 使用 SLF4J 作為日誌的抽象層,默認使用 Log4J 來做實際的日誌工作。使用兩層日誌抽象看起來似乎是多餘的。這裡簡要的說明如何來配置 Log4J,雖然 Log4J 非常靈活且功能強大,但是也有一些複雜,這裡只是簡要的介紹一下基本的用法。

Log4J 的配置文件為 log4j.properties,系統會從 classpath 中載入這個文件。如果沒有找到 log4j.properties 文件,會輸出如下警告資訊:

log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).  log4j:WARN Please initialize the log4j system properly.  log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

如果看到上述日誌,那麼後續所有的日誌消息會被丟棄。通常 log4j.properties 文件會保存在 classpath 中的 conf 目錄下。

2. 配置文件

2.1 組成部分

來看看 ZooKeeperlog4j.properties 的主要組成部分:

zookeeper.root.logger=INFO, CONSOLE  zookeeper.console.threshold=INFO  zookeeper.log.dir=.  zookeeper.log.file=zookeeper.log  zookeeper.log.threshold=DEBUG  zookeeper.tracelog.dir=.  zookeeper.tracelog.file=zookeeper_trace.log    log4j.rootLogger=${zookeeper.root.logger}    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender  log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}  log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout  log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -    ...    log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender  log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}  log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}  log4j.appender.ROLLINGFILE.MaxFileSize=10MB  log4j.appender.ROLLINGFILE.MaxBackupIndex=10  log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout  log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -  ...

2.2 詳解

zookeeper.root.logger=INFO, CONSOLE  zookeeper.console.threshold=INFO  zookeeper.log.dir=.  zookeeper.log.file=zookeeper.log  zookeeper.log.threshold=DEBUG  zookeeper.tracelog.dir=.  zookeeper.tracelog.file=zookeeper_trace.log

上面配置中,所有配置項均以 zookeeper. 開頭,配置了該文件的默認值,這些配置項實際是系統屬性配置,可以通過 java 命令行指定 -D 參數來覆蓋 JVM 的配置。第一行的日誌配置中,默認配置了日誌消息的級別為 INFO,即所有低於 INFO 級別的日誌消息都會被丟棄,使用的 appender 為 CONSOLE。你可以指定多個 appender,例如,如果你想將日誌資訊同時輸出到 CONSOLEROLLINGFILE 時,那麼可以配置 zookeeper.root.loggerINFO, CONSOLE, ROLLINGFILE

log4j.rootLogger=${zookeeper.root.logger}

rootLogger 指定了處理所有日誌消息的級別 INFO 以及日誌處理器 CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

該行配置 CONSOLE appender 實現類 ConsoleAppender

log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}

在 appender 的定義中也可以過濾日誌消息。該行配置了這個 appender 會忽略所有低於 INFO 級別的消息,因為 zookeeper.root.logger 中定義了全局閾值為 INFO

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout  log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -

appender 使用的布局類在輸出前對輸出日誌進行格式化操作。我們通過布局模式定義了輸出日誌消息外還定義了輸出日誌的級別、日期、執行緒資訊和調用位置等資訊。

log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender

RollingFileAppender 實現了滾動日誌文件的輸出,而不是不斷的輸出到一個單獨的文件或者控制台。除非 ROLLINGFILErootLogger 引用,否則該 appender 會被忽略。

log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}

定義 ROLLINGFILE 的輸出級別為 DEBUG,因為 rootLogger 過濾了所有低於 INFO 級別的日誌,所以,你如果想看 DEBUG 消息,就必須將 zookeeper.root.loggerINFO 改成 DEBUG

log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}  log4j.appender.ROLLINGFILE.MaxFileSize=10MB  log4j.appender.ROLLINGFILE.MaxBackupIndex=10  log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout  log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] -  ...

上面配置設置了滾動輸出日誌路徑以及文件最大大小。此外還使用布局類在日誌輸出前進行格式化操作。我們通過布局模式定義了輸出日誌消息外還定義了輸出日誌的級別、日期、執行緒資訊和調用位置等資訊。

日誌記錄功能會影響到進程的性能,尤其是在開啟 DEBUG 級別時。同時 DEBUG 日誌會提供大量有價值的資訊,可以幫助我們診斷問題。

3. 修改日誌輸出路徑

當執行 zkServer.sh 時,會在執行命令的文件夾下會產生 zookeeper.out 日誌文件來記錄 ZooKeeper 的運行日誌。這種方式會讓日誌文件不便於查找,對輸出路徑和大小不能進行控制,所以需要修改日誌輸出方式。

3.1 修改zkEnv.sh

修改 $ZOOKEEPER_HOME/bin 目錄下的 zkEnv.sh 文件,ZOO_LOG_DIR 指定日誌輸出的目錄,ZOO_LOG4J_PROP,指定日誌輸出級別 INFO,ROLLINGFILE:

# 以下是原配置  if [ "x${ZOO_LOG_DIR}" = "x" ]  then      ZOO_LOG_DIR="."  fi    if [ "x${ZOO_LOG4J_PROP}" = "x" ]  then      ZOO_LOG4J_PROP="INFO,CONSOLE"  fi    # 以下是修改後配置  if [ "x${ZOO_LOG_DIR}" = "x" ]  then      ZOO_LOG_DIR="/Users/smartsi/opt/zookeeper/logs"  fi    if [ "x${ZOO_LOG4J_PROP}" = "x" ]  then      ZOO_LOG4J_PROP="INFO,ROLLINGFILE"  fi

ZOO_LOG_DIR="${ZOOKEEPER_HOME}/logs",日誌會輸出都 /Users/xxx/opt/zookeeper/bin/~/opt/zookeeper/logs 目錄下。需要設置為 /Users/smartsi/opt/zookeeper/logs 目錄,才會正確輸出到 /Users/xxx/opt/zookeeper/logs 目錄下。

3.2 修改log4j.properties

修改 $ZOOKEEPER_HOME/conf/log4j.properties 文件 zookeeper.root.logger 的值與前一個文件的 ZOO_LOG4J_PROP 保持一致,在這日誌配置是以日誌大小進行滾動:

# 以下是原配置  zookeeper.root.logger=INFO, CONSOLE  log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender    # 以下是修改後配置  zookeeper.root.logger=INFO, ROLLINGFILE  log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender

上述兩個文件修改後,重新啟動服務,ZooKeeper 會將日誌文件保存到 ${ZOOKEEPER_HOME}/logs 目錄下,文件名為 log4j.properties 文件中配置的 zookeeper.log