linux - ¿Por qué zookeeper no utiliza mi log4j.properties directorio de registro de archivos
apache environment-variables (5)
Creo que la respuesta a mi pregunta es que necesito mover ese archivo log4j.properties a mi classpath, y solo entonces zkEnv.sh leerá los valores que establecí en log4j.properties cuando llamo a zkServer.sh. Creo que simplemente no entendí cómo usar log4j correctamente.
En mi archivo zookeeper / conf / log4j.properties, configuré zookeeper.log.dir en $ HOME / zklogs
Cuando uso zkServer.sh, no usa ese directorio. En su lugar, usa el $ {ZOO_LOG_DIR} que cuando lo echo, sale a "."
No entiendo cómo solucionar este problema, no veo el $ {ZOO_LOG_DIR} establecido en ningún lado. No estoy seguro de cómo se establece en "." en absoluto. Tampoco sé cómo ejecutar zookeeper sin zkServer.sh. También soy un experto en Linux y un poco perdido en este tema ...
¿Alguien sabe cómo puedo solucionar este problema para que use el directorio establecido en mi archivo log4j.properties en el directorio conf?
*** ACTUALIZACIÓN, encontré en zkEnv.sh en el directorio bin de mi instalación zookeeper. Hay un código:
if["x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="."
fi
No estoy seguro de lo que está sucediendo en esa primera línea, pero tiene que ser aquí que algo va mal. Espero que vea zookeeper.log.dir desde mi archivo log4j.properties. ¿Alguien puede decirme si eso debería ser cierto? No quiero conectar el camino aquí ...
Por lo que puedo ver desde zkEnv.sh, la carpeta zookeeper / conf ya está en el classpath. Hay dos problemas allí:
- zkServer.sh agrega "-Dzookeeper.log.dir =." al comando de inicio ZK a menos que especifiques la variable de entorno ZOO_LOG_DIR
incluso si especifica ZOO_LOG_DIR, es posible que ZK no pueda encontrar su archivo log4j.properties, porque zkEnv.sh especifica CLASSPATH así:
$CLASSPATH="$ZOOCFGDIR:$CLASSPATH"
Esto funciona bien si su variable de entorno $ CLASSPATH no está vacía, sin embargo, cuando está vacía, simplemente deja un punto final, lo que daña su ruta de clase. Cambié las líneas de arriba a esto:
#add the zoocfg dir to classpath
if [ "x${CLASSPATH}" = "x" ]
then
CLASSPATH="$ZOOCFGDIR"
else
CLASSPATH="$ZOOCFGDIR:$CLASSPATH"
fi
y también pasó el entorno ZOO_LOG_DIR para ZK, porque zkServer.sh genera -Dzookeeper.log.dir el argumento VM al iniciar ZK. Aquí está el comando que inicia ZooKeeper para mí, lo hace leer /opt/zookeeper/conf/log4j.properties y mantener los archivos de registro en / opt / zimbra / log:
ZOO_LOG_DIR=/opt/zimbra/log /opt/zookeeper/bin/zkServer.sh start
Quería agregar cómo solucioné este problema / personalicé mi entorno.
Hay 2 mecanismos de registro que funcionan aquí:
- bin / zkServer.sh redirecciona stdout y stderr del servidor zookeeper a zookeeper.out
- log4j puede anexar registros a varios lugares, incluyendo:
- CONSOLA - que termina en stdout y stderr del servidor zookeeper
- ROLLINGFILE - que se envía a zookeeper.log
bin / zkServer.sh utiliza:
- ZOO_LOG_DIR para establecer la ruta de zookeeper.out y log4j.
- ZOO_LOG4J_PROP para establecer el nivel de registro log4j y qué apéndices de registro están activados
Los valores predeterminados "eventuales" en la configuración conf / log4j.properties se establecen mediante una combinación de scripts de zookeeper bash:
- ZOO_LOG_DIR =. (el directorio de trabajo desde el cual se inició zookeeper)
- establecer dentro de conf / log4j.properties como zookeeper.log.dir
- ZOO_LOG4J_PROP = INFO, CONSOLA
- establecer dentro de conf / log4j.properties como zookeeper.root.logger
El efecto de activar la CONSOLA de apilador de registros es que los registros ahora pasan a stdout. Debido a que bin / zkServer.sh redirige stdout y stderr a zookeeper.out, log4j registros terminan en zookeeper.out. El efecto de desactivar ROLLINGFILE es que no se crea ningún archivo zookeeper.log.
El registro de zookeeper.out no está girado. El registro zookeeper.log está configurado para rotar y se puede configurar para que expire los registros antiguos.
Quería que los registros rodaran y expirara. Lo primero que tuve que hacer fue cambiar conf / log4j.properties para causar la caducidad / eliminación de registros antiguos. Lo hice al establecer log4j.appender.ROLLINGFILE.MaxBackupIndex dentro de conf / log4j.properties. Lo segundo que tuve que hacer fue establecer el directorio de registro, el nivel de registro y los anexos.
Tengo un script bash que se ejecuta cada minuto. Si ve que zookeeper no se está ejecutando, se ejecuta:
bin/zkServer.sh start
Lo cambié para especificar las variables de entorno esperadas por 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
El efecto de desactivar la CONSOLA de apilamiento de registros es que los registros log4j ya no terminan en zookeeper.out. El efecto de activar ROLLINGFILE es que el archivo zookeeper.log se crea, rota y expira.
Por cierto, conf / log4j.properties aparentemente ya estaba en mi classpath. No tuve que hacer ningún cambio en ese sentido.
Esta cadena contribuyó significativamente a mi comprensión: https://groups.google.com/forum/#!msg/nosql-databases/aebIvNnT0xY/doky1X9-WfwJ
Otra opción para cambiar el directorio de registro de archivos a través de la variable de entorno ZOO_LOG_DIR es crear su propio zk-server-1 / conf / zookeeper-env.sh.
Al leer los scripts zookeeper-3.4.6 dist bash (ti zkEnv.sh), obtienen el archivo zookeeper-env.sh si existe. Aquí está su contenido (mi creación):
export ZOO_HOME=$ZOOKEEPER_PREFIX
echo $ZOO_HOME
export ZOO_LOG_DIR=$ZOO_HOME/logs
Estoy acostumbrado a tener una variable PRODUCTNAME _HOME, que apunta al dir de instalación superior de zookeeper. Este dir superior parece ser nombrado $ ZOOKEEPER_PREFIX por zookeeper dist, que aliá con $ ZOO_HOME y lo uso para la variable de entorno ZOO_LOG_DIR.
Al final de esta publicación, escribí en spool la información de depuración de scripts bash, que me ayuda a investigar qué entorno o variables locales se usan más los valores.
Como lo veo, el /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf dir está en el CLASSPATH, por lo tanto, el archivo log4j.properties es elegible para la carga de recursos a través del cargador de clases de java para el framework log4j (que es la forma en que se implementa log4j AFAIR).
joma@kopernikus-u:~/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
zkServer.sh
obtiene sus variables de entorno de zkEnv.sh
El archivo env establece un classpath que incluye el archivo log4j si se encuentra en la ubicación esperada.
ZOOXFGDIR=ZOOBINDIR/../conf
Dejé caer algunos ecos en zkServer.sh para rastrear lo que está pasando. Descubrí que classpath se estaba configurando correctamente, pero logdir y log4j_prop no se estaban configurando. Entonces los agregué a zkEnv.sh
. Los registros parecen estar apareciendo ahora en la ubicación esperada.
ZOO_LOG_DIR="/var/log/zookeeper"
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"