web-dev-qa-db-fra.com

Pourquoi zookeeper n'utilise pas mon répertoire de journaux de fichiers log4j.properties

Dans mon fichier zookeeper/conf/log4j.properties, j'ai défini le fichier zookeeper.log.dir sur $ HOME/zklogs

Lorsque j'utilise zkServer.sh, il n'utilise pas ce répertoire. Au lieu de cela, il utilise le $ {Zoo_LOG_DIR} qui quand je le fais écho, sort à "."

Je ne comprends pas comment résoudre ce problème, je ne vois pas $ {Zoo_LOG_DIR} défini nulle part. Je ne sais pas comment il est réglé sur "." du tout. Je ne sais pas non plus comment lancer zookeeper sans zkServer.sh. Je suis aussi noobish sous linux et un peu perdu sur cette question ...

Quelqu'un sait-il comment résoudre ce problème afin qu'il utilise le répertoire défini dans mon fichier log4j.properties dans le répertoire conf?

*** MISE À JOUR, j'ai trouvé dans zkEnv.sh dans le répertoire bin de mon installation zookeeper. Il y a du code:

if["x${Zoo_LOG_DIR}" = "x" ]
then
   Zoo_LOG_DIR="."
fi

Je ne sais pas ce qui se passe dans cette première ligne, mais il faut que ce soit là que quelque chose ne va pas. Je m'attends à ce qu'il regarde zookeeper.log.dir à partir de mon fichier log4j.properties. Quelqu'un peut-il me dire si cela devrait être vrai? Je ne veux pas simplement câbler le chemin ici ...

25
smuggledPancakes

Je voulais ajouter comment j'ai résolu ce problème/personnalisé mon environnement.

Deux mécanismes de journalisation fonctionnent ici:

  • bin/zkServer.sh redirige stdout et stderr du serveur zookeeper vers zookeeper.out
  • log4j peut être ajouté aux journaux à plusieurs endroits, notamment:
    • CONSOLE - qui se retrouve dans stdout et stderr du serveur zookeeper
    • ROLLINGFILE - qui est envoyé à zookeeper.log

bin/zkServer.sh utilise:

  • Zoo_LOG_DIR pour définir le chemin d'accès à la fois pour zookeeper.out et log4j.
  • Zoo_LOG4J_PROP pour définir le niveau de journalisation log4j et les ajouts de journaux activés

Les valeurs par défaut "éventuelles" dans la configuration conf/log4j.properties sont définies par une combinaison de scripts bash zookeeper:

  • Zoo_LOG_DIR =. (le répertoire de travail à partir duquel zookeeper est démarré)
    • définir à l'intérieur de conf/log4j.properties comme zookeeper.log.dir
  • Zoo_LOG4J_PROP = INFO, CONSOLE
    • définir à l'intérieur de conf/log4j.properties comme zookeeper.root.logger

L'activation de la console de consignation de journal a pour effet que les journaux vont désormais à stdout. Étant donné que bin/zkServer.sh redirige stdout et stderr vers zookeeper.out, les journaux log4j se retrouvent dans zookeeper.out. La désactivation de ROLLINGFILE a pour effet qu'aucun fichier zookeeper.log n'est créé.

Le journal zookeeper.out n'est pas tourné. Le journal zookeeper.log est configuré pour être tourné et peut être défini pour expirer les anciens journaux.

Je voulais que les journaux roulent et expirent. La première chose que je devais faire était de modifier conf/log4j.properties pour provoquer l'expiration/suppression des anciens journaux. J'ai fait cela en définissant log4j.appender.ROLLINGFILE.MaxBackupIndex dans conf/log4j.properties. La deuxième chose que je devais faire était de définir le répertoire des journaux, le niveau de journalisation et les annexes.

J'ai un script bash qui s'exécute toutes les minutes. S'il voit que zookeeper ne fonctionne pas, il s'exécute:

bin/zkServer.sh start

Je l'ai changé pour spécifier les variables environnementales attendues par 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

L'effet de la désactivation de la console de consignation de journal est que les journaux log4j ne se retrouvent plus dans zookeeper.out. L'activation de ROLLINGFILE entraîne la création, la rotation et l'expiration du fichier zookeeper.log.

BTW, conf/log4j.properties était apparemment déjà dans mon chemin de classe. Je n'ai dû apporter aucun changement à cet égard.

Cette chaîne a contribué de manière significative à ma compréhension: https://groups.google.com/forum/#!msg/nosql-databases/aebIvNnT0xY/doky1X9-WfwJ

40
Jeff Maass

zkServer.sh obtient ses variables d'environnement de zkEnv.sh Le fichier env définit un chemin de classe qui inclut le fichier log4j s'il se trouve à l'emplacement attendu.

ZOOXFGDIR=ZOOBINDIR/../conf

J'ai déposé quelques échos dans zkServer.sh pour suivre ce qui se passe. J'ai trouvé que classpath était correctement défini, mais logdir et log4j_prop n'étaient pas définis. Je les ai donc ajoutés à zkEnv.sh. Les journaux semblent maintenant apparaître à l'emplacement prévu.

Zoo_LOG_DIR="/var/log/zookeeper"
Zoo_LOG4J_PROP="INFO,ROLLINGFILE"
7
jorfus

Pour autant que je puisse voir à partir du dossier zkEnv.sh zookeeper/conf est déjà dans le chemin de classe. Il y a là deux problèmes:

  1. zkServer.sh ajoute "-Dzookeeper.log.dir =." à la commande de lancement ZK sauf si vous spécifiez la variable d'environnement Zoo_LOG_DIR
  2. même si vous spécifiez Zoo_LOG_DIR, ZK peut toujours ne pas trouver votre fichier log4j.properties, car zkEnv.sh spécifie CLASSPATH comme ceci:

    $CLASSPATH="$ZOOCFGDIR:$CLASSPATH"

cela fonctionne bien si votre variable d'environnement $ CLASSPATH n'est pas vide, mais quand elle est vide, elle laisse juste un deux-points de fin, ce qui fout le chemin de classe. J'ai changé les lignes ci-dessus en ceci:

#add the zoocfg dir to classpath
if [ "x${CLASSPATH}" = "x" ]
then
    CLASSPATH="$ZOOCFGDIR"
else
    CLASSPATH="$ZOOCFGDIR:$CLASSPATH"
fi

et également passé l'environnement Zoo_LOG_DIR pour ZK, car zkServer.sh génère -Dzookeeper.log.dir VM argument lors du démarrage de ZK. Voici la commande qui démarre ZooKeeper pour moi, la fait lire/choisir /zookeeper/conf/log4j.properties et conservez les fichiers journaux dans/opt/zimbra/log:

Zoo_LOG_DIR=/opt/zimbra/log /opt/zookeeper/bin/zkServer.sh start
2
Greg S

Je crois que la réponse à ma question est que j'ai besoin de déplacer ce fichier log4j.properties dans mon chemin de classe et alors et seulement alors zkEnv.sh lira les valeurs que j'ai définies dans log4j.properties lorsque j'appelle zkServer.sh. Je crois que je n'ai tout simplement pas compris comment utiliser correctement log4j.

1
smuggledPancakes

Une autre option pour modifier le répertoire du fichier journal via la variable d'environnement Zoo_LOG_DIR consiste à créer votre propre zk-server-1/conf/zookeeper-env.sh.

En lisant les scripts dist bash de zookeeper-3.4.6 (t.i. ZkEnv.sh), ils source ce fichier zookeeper-env.sh s'il existe. Voici son contenu (créé):

export Zoo_HOME=$ZOOKEEPER_PREFIX
echo $Zoo_HOME
export Zoo_LOG_DIR=$Zoo_HOME/logs

J'ai l'habitude d'avoir une variable PRODUCTNAME _ HOME, qui pointe vers le répertoire d'installation supérieur de zookeeper. Ce répertoire supérieur semble être nommé $ ZOOKEEPER_PREFIX par zookeeper dist, que j'utilise avec $ Zoo_HOME et que je l'utilise pour la variable d'environnement Zoo_LOG_DIR.

À la fin de ce post, j'ai mis en file d'attente les informations de débogage des scripts bash - m'aide à rechercher quel environnement ou quelles variables locales et valeurs sont utilisées.

Comme je le vois, le répertoire /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf est sur le CLASSPATH, donc le fichier log4j.properties est éligible pour le chargement des ressources via le chargeur de classe de Java pour le framework log4j (qui est la façon dont log4j est implémenté 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
1
Joerg M.

Peut-être pas la réponse recherchée, mais pour zookeeper-3.4.11 dans le répertoire conf, vous pouvez définir les niveaux et la configuration appropriés dans le fichier log4j.properties

0
Antoni