Почему zookeeper не использует мой журнал журналов log4j.properties
В моем файле zookeeper/conf/log4j.properties я установил zookeeper.log.dir в $HOME/zklogs
Когда я использую zkServer.sh, он не использует этот каталог. Вместо этого он использует ${ZOO_LOG_DIR}, который, когда я его эхо, выхожу на "."
Я не понимаю, как исправить эту проблему, я не вижу, что ${ZOO_LOG_DIR} установлен где угодно. Я не уверен, как он настроен на "." вообще. Я также не знаю, как запустить zookeeper без zkServer.sh. Я тоже noobish в linux и немного потерял по этому вопросу...
Кто-нибудь знает, как я могу исправить эту проблему, чтобы она использовала каталог, установленный в моем файле log4j.properties в каталоге conf?
*** UPDATE, я нашел в zkEnv.sh в каталоге bin моей установки zookeeper. Есть код:
if["x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="."
fi
Я не уверен, что происходит в этой первой строке, но он должен быть здесь, что что-то идет не так. Я ожидаю, что он посмотрит на zookeeper.log.dir из моего файла log4j.properties. Может ли кто-нибудь сказать мне, должно ли это быть правдой? Я не хочу просто прокладывать путь сюда...
Ответы
Ответ 1
Я хотел добавить, как я исправил эту проблему/настроил свою среду.
Здесь работают 2 механизма регистрации:
- bin/zkServer.sh перенаправляет сервер stookout zookeeper и stderr на zookeeper.out
- log4j может присоединяться к журналам в нескольких местах, включая:
- CONSOLE - который заканчивается на сервере stookout zookeeper и stderr
- ROLLINGFILE - который отправляется в zookeeper.log
bin/zkServer.sh использует:
- ZOO_LOG_DIR, чтобы установить путь как для zookeeper.out, так и для log4j.
- ZOO_LOG4J_PROP, чтобы установить уровень ведения журнала log4j и какие приложения для журналов включены
"Возможные" значения по умолчанию в настройке conf/log4j.properties устанавливаются комбинацией zookeeper bash scripts:
- ZOO_LOG_DIR =. (рабочий каталог, из которого запускается zookeeper)
- установить внутри conf/log4j.properties как zookeeper.log.dir
- ZOO_LOG4J_PROP = INFO, CONSOLE
- установить внутри conf/log4j.properties как zookeeper.root.logger
Эффект включения менеджера журналов CONSOLE заключается в том, что журналы теперь идут в stdout. Поскольку bin/zkServer.sh перенаправляет stdout и stderr на zookeeper.out, log4j logs заканчивается в zookeeper.out. Эффект отключения ROLLINGFILE заключается в том, что не создается файл zookeeper.log.
Журнал zookeeper.out не вращается. Журнал zookeeper.log настроен на поворот и может быть установлен для истечения старых журналов.
Я хотел, чтобы журналы были свернуты и истекли. Первое, что я должен был сделать, это изменить conf/log4j.properties, чтобы вызвать истечение/удаление старых журналов. Я сделал это, установив log4j.appender.ROLLINGFILE.MaxBackupIndex внутри conf/log4j.properties. Второе, что мне нужно было сделать, это установить каталог журнала, уровень ведения журнала и добавление.
У меня есть bash script, который запускается каждую минуту. Если он видит, что zookeeper не работает, он запускается:
bin/zkServer.sh start
Я изменил его, чтобы указать переменные среды, ожидаемые bin/zkServer.sh.
sudo ZOO_LOG_DIR=/opt/zookeeper-3.4.6/logs ZOO_LOG4J_PROP='INFO,ROLLINGFILE' /opt/zookeeper-3.4.6/bin/zkServer.sh start
Эффект отключения журнала CONSOLE заключается в том, что log4j logs теперь больше не заканчивается в zookeeper.out. Эффект включения ROLLINGFILE заключается в том, что файл zookeeper.log создается, вращается и истек.
BTW, conf/log4j.properties, по-видимому, уже находится в моем классе. Я не должен был делать никаких изменений в этом отношении.
Эта цепочка значительно способствовала моему пониманию:
https://groups.google.com/forum/#!msg/nosql-databases/aebIvNnT0xY/doky1X9-WfwJ
Ответ 2
zkServer.sh
получает переменные среды из zkEnv.sh
Файл env устанавливает путь к классу, который включает файл log4j, если он находится в ожидаемом месте.
ZOOXFGDIR=ZOOBINDIR/../conf
Я отбросил некоторые эхо в zkServer.sh, чтобы проследить, что происходит.
Я обнаружил, что classpath был установлен правильно, но logdir и log4j_prop не были установлены. Поэтому я добавил их в zkEnv.sh
. В настоящее время появляются журналы в ожидаемом месте.
ZOO_LOG_DIR="/var/log/zookeeper"
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
Ответ 3
Насколько я могу видеть из zkEnv.sh каталог zookeeper/conf уже находится в пути к классам. Там есть две проблемы:
- zkServer.sh добавляет "-Dzookeeper.log.dir =." к команде запуска ZK, если вы не указали переменную среды ZOO_LOG_DIR
-
даже если вы укажете ZOO_LOG_DIR, ZK все равно не сможет найти ваш файл log4j.properties, потому что zkEnv.sh указывает CLASSPATH следующим образом:
$CLASSPATH="$ZOOCFGDIR:$CLASSPATH"
это отлично работает, если переменная среды $CLASSPATH не пуста, однако, когда она пуста, она просто оставляет конечный двоеточие, что заставляет ваш путь к классу.
Я изменил строки выше:
#add the zoocfg dir to classpath
if [ "x${CLASSPATH}" = "x" ]
then
CLASSPATH="$ZOOCFGDIR"
else
CLASSPATH="$ZOOCFGDIR:$CLASSPATH"
fi
а также передал среду ZOO_LOG_DIR для ZK, потому что zkServer.sh генерирует аргумент VM-Dzookeeper.log.dir при запуске ZK. Вот команда, которая запускает ZooKeeper для меня, заставляет ее читать /opt/zookeeper/conf/log 4j.properties и хранить файлы журнала в /opt/zimbra/log:
ZOO_LOG_DIR=/opt/zimbra/log /opt/zookeeper/bin/zkServer.sh start
Ответ 4
Я считаю, что ответ на мой вопрос заключается в том, что мне нужно переместить этот файл log4j.properties в мой путь к классу, а затем и только тогда будет zkEnv.sh читать значения, которые я установил в log4j.properties, когда я вызываю zkServer.sh, Я считаю, что просто не понял, как правильно использовать log4j.
Ответ 5
Другой вариант изменить каталог журнала файлов с помощью переменной среды ZOO_LOG_DIR - создать собственный zk-server-1/conf/zookeeper-env.sh.
Чтение скриптов zookeeper-3.4.6 dist bash (t.i.zkEnv.sh), они отправляют этот файл zookeeper-env.sh, если он существует. Вот он (мой созданный) контент:
export ZOO_HOME=$ZOOKEEPER_PREFIX
echo $ZOO_HOME
export ZOO_LOG_DIR=$ZOO_HOME/logs
Я привык иметь переменную PRODUCTNAME_HOME, которая указывает на верхний установочный каталог zookeeper. Этот верхний каталог, по-видимому, называется $ZOOKEEPER_PREFIX по zookeeper dist, который я aliase с $ZOO_HOME и использую его для переменной среды ZOO_LOG_DIR.
В конце этого сообщения я намотал информацию об отлаживании сценариев bash - помогает мне исследовать, какие среды или локальные переменные плюс значения используются.
Как я вижу, файл /home/joma/dev/programme/zk -local-ensemble/zk-server-1/bin/../conf находится в CLASSPATH, поэтому файл log4j.properties имеет право для загрузки ресурсов через java class-loader для рамки log4j (таким образом, как log4j реализован AFAIR).
[email protected]:~/dev/programme/zk-local-ensemble$ bash -x zk-server-1/bin/zkServer.sh start
+ '[' x = x ']'
+ JMXLOCALONLY=false
+ '[' x = x ']'
+ echo 'JMX enabled by default'
JMX enabled by default
+ ZOOMAIN='-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain'
+ ZOOBIN=zk-server-1/bin/zkServer.sh
++ dirname zk-server-1/bin/zkServer.sh
+ ZOOBIN=zk-server-1/bin
++ cd zk-server-1/bin
++ pwd
+ ZOOBINDIR=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin
+ '[' -e zk-server-1/bin/../libexec/zkEnv.sh ']'
+ . /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/zkEnv.sh
++ ZOOBINDIR=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin
++ ZOOKEEPER_PREFIX=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/..
++ '[' x = x ']'
++ '[' -e /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf ']'
++ ZOOCFGDIR=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf
++ '[' -f /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zookeeper-env.sh ']'
++ . /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zookeeper-env.sh
+++ export ZOO_HOME=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/..
+++ ZOO_HOME=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/..
+++ echo /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/..
/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/..
+++ export ZOO_LOG_DIR=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../logs
+++ ZOO_LOG_DIR=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../logs
++ '[' x = x ']'
++ ZOOCFG=zoo.cfg
++ ZOOCFG=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zoo.cfg
++ '[' -f /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/java.env ']'
++ '[' x/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../logs = x ']'
++ '[' x = x ']'
++ ZOO_LOG4J_PROP=INFO,CONSOLE
++ '[' /home/joma/entwicklung/programme/jdk1.7.0_51 '!=' '' ']'
++ JAVA=/home/joma/entwicklung/programme/jdk1.7.0_51/bin/java
++ CLASSPATH=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:
++ for i in '"$ZOOBINDIR"/../src/java/lib/*.jar'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ '[' -e '/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../share/zookeeper/zookeeper-*.jar' ']'
++ for i in '"$ZOOBINDIR"/../zookeeper-*.jar'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ LIBPATH=("${ZOOBINDIR}"/../lib/*.jar)
++ for i in '"${LIBPATH[@]}"'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ for i in '"${LIBPATH[@]}"'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/log4j-1.2.16.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ for i in '"${LIBPATH[@]}"'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/netty-3.7.0.Final.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/log4j-1.2.16.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ for i in '"${LIBPATH[@]}"'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-api-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/netty-3.7.0.Final.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/log4j-1.2.16.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ for i in '"${LIBPATH[@]}"'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-api-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/netty-3.7.0.Final.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/log4j-1.2.16.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ for d in '"$ZOOBINDIR"/../build/lib/*.jar'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../build/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-api-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/netty-3.7.0.Final.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/log4j-1.2.16.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ CLASSPATH='/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../build/classes:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../build/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-api-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/netty-3.7.0.Final.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/log4j-1.2.16.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:'
++ case "`uname`" in
+++ uname
++ cygwin=false
++ false
+ '[' x '!=' x ']'
+ '[' x '!=' x ']'
++ dirname /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zoo.cfg
+ '[' x/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf '!=' x/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf ']'
+ false
+ KILL=kill
+ echo 'Using config: /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zoo.cfg'
Using config: /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zoo.cfg
+ '[' -z '' ']'
++ grep '^[[:space:]]*dataDir' /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zoo.cfg
++ sed -e 's/.*=//'
+ ZOO_DATADIR=/home/joma/dev/programme/zk-local-ensemble/data/zk1
+ '[' '!' -d /home/joma/dev/programme/zk-local-ensemble/data/zk1 ']'
+ ZOOPIDFILE=/home/joma/dev/programme/zk-local-ensemble/data/zk1/zookeeper_server.pid
+ '[' '!' -w /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../logs ']'
+ _ZOO_DAEMON_OUT=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../logs/zookeeper.out
+ case $1 in
+ echo -n 'Starting zookeeper ... '
Starting zookeeper ... + '[' -f /home/joma/dev/programme/zk-local-ensemble/data/zk1/zookeeper_server.pid ']'
+ '[' 0 -eq 0 ']'
+ /bin/echo -n 24744
+ nohup /home/joma/entwicklung/programme/jdk1.7.0_51/bin/java -Dzookeeper.log.dir=/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../logs -Dzookeeper.root.logger=INFO,CONSOLE -cp '/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../build/classes:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../build/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-log4j12-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/slf4j-api-1.6.1.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/netty-3.7.0.Final.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/log4j-1.2.16.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../lib/jline-0.9.94.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../zookeeper-3.4.6.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../src/java/lib/*.jar:/home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf:' -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf/zoo.cfg
+ sleep 1
+ echo STARTED
STARTED