2014-10-28 13 views
20

W moim Heca/conf plik/log4j.properties ustawić zookeeper.log.dir $ HOME/zklogsDlaczego nie zookeeper używać mojego katalogu plik dziennika log4j.properties

Gdy używam zkServer.sh Czyni nie używaj tego katalogu. Zamiast tego używa $ {ZOO_LOG_DIR}, który po jego wyświetleniu wychodzi na "."

Nie rozumiem, jak rozwiązać ten problem, nie widzę zestawu $ {ZOO_LOG_DIR} w dowolnym miejscu. Nie jestem pewien, jak to jest ustawione na "." w ogóle. Nie wiem też, jak uruchomić zookeeper bez zkServer.sh. Nie jestem też noobia w Linuksie i trochę zagubiony w tej kwestii ...

Czy ktoś wie, w jaki sposób mogę rozwiązać ten problem, aby użyć katalogu określonego w pliku log4j.properties w katalogu conf?

*** ZAKTUALIZOWAŁ, Znalazłem w zkEnv.sh w katalogu bin instalacji zookeepera. Jest Kod:

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

Nie jestem pewien, co dzieje się w tej pierwszej linii, ale to musi być tutaj, że coś jest nie tak. Oczekuję, że zajrzy do pliku zookeeper.log.dir z mojego pliku log4j.properties. Czy ktoś może mi powiedzieć, czy to prawda? Nie chcę po prostu utwierdzać ścieżki tutaj ...

Odpowiedz

33

chciałem dodać, jak to naprawiłem problem/dostosuj moje środowisko.

Istnieją 2 mechanizmy rejestrowania pracujących tutaj:

  • bin/zkServer.sh przekierowania stdout serwera Heca i stderr do Heca.z
  • log4j można dołączyć do kłód do kilku miejscach, w tym:
    • Console - który kończy się w stdout serwera Heca i stderr
    • ROLLINGFILE - która jest wysyłana do zookeeper.log

bin/zkServer.sh używa:

  • ZOO_LOG_DIR do ustawienia ścieżki dla zookeeper.out i log4j.
  • ZOO_LOG4J_PROP ustawić poziom rejestrowania log4j i co dziennika appenders są włączone

The „ewentualne” domyślnych ustawień w conf/log4j.properties są ustawiane za pomocą kombinacji bashu Heca:

  • ZOO_LOG_DIR =. (Katalog roboczy, z którego jest uruchamiany zookeeper)
    • zestaw wewnątrz conf/log4j.properties jak zookeeper.log.dir
  • ZOO_LOG4J_PROP = INFO konsola
    • ustawionym wewnątrz conf/log4j. właściwości jak zookeeper.root.logger

efekt włączeniu konsoli dziennika appender jest to, że kłody teraz przejść na standardowe wyjście. Ponieważ bin/zkServer.sh przekierowuje stdout i stderr do zookeeper.out, log4j loguje się do zookeeper.out. Efekt wyłączenia ROLLINGFILE polega na tym, że nie jest tworzony żaden plik zookeeper.log.

Dziennik zookeeper.out nie jest obracany. Dziennik zookeeper.log jest ustawiony jako obracany, a może być ustawiony jako w celu wygaśnięcia starych dzienników.

Chciałem, aby dzienniki się przetoczyły i wygasły. Pierwszą rzeczą, którą musiałem zrobić, to zmienić conf/log4j.properties, aby spowodować wygaśnięcie/usunięcie starych logów. Zrobiłem to, ustawiając log4j.appender.ROLLINGFILE.MaxBackupIndex wewnątrz conf/log4j.properties. Drugą rzeczą, którą musiałem zrobić, było ustawienie katalogu dzienników, poziomu logowania i aplikacji.

Mam skrypt bash uruchamiany co minutę. Jeśli widzi, że zookeeper nie działa, to działa:

bin/zkServer.sh start 

Zmieniłem go określić zmienne środowiskowe oczekiwane przez 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 

Efekt wyłączeniu dziennika appender konsoli że dzienniki Log4j teraz już nie skończyć w zookeeper.out. Efektem włączenia ROLLINGFILE jest utworzenie, obrót i wygaśnięcie pliku zookeeper.log.

BTW, conf/log4j.properties było widocznie już w mojej ścieżce klas. Nie musiałem wprowadzać żadnych zmian w tym zakresie.

Ten łańcuch znacząco przyczynił się do mojego zrozumienia: https://groups.google.com/forum/#!msg/nosql-databases/aebIvNnT0xY/doky1X9-WfwJ

+0

Zobacz również https: //issues.apache .org/jira/browse/ZOOKEEPER-1983 –

1

Wierzę, że odpowiedź na moje pytanie jest taka, że ​​muszę przenieść ten plik log4j.properties do mojej ścieżki klasy, a następnie i tylko wtedy będzie zkEnv.sh czytać z wartości ustawiane w pliku log4j.properties podczas wywoływania zkServer.sh. Wierzę, że po prostu nie rozumiem, jak poprawnie używać log4j.

2

O ile widzę z folderu zkEnv.sh folder zookeeper/conf znajduje się już w ścieżce klas. Występują tam dwa problemy:

  1. zkServer.sh dodaje "-Dzookeeper.log.dir =." do polecenia uruchomić ZK chyba określić środowisko ZOO_LOG_DIR zmienną
  2. nawet jeśli podasz ZOO_LOG_DIR, ZK może nadal być w stanie znaleźć plik log4j.properties, ponieważ zkEnv.sh określa CLASSPATH tak:

    $CLASSPATH="$ZOOCFGDIR:$CLASSPATH"

działa to dobrze, jeśli zmienna środowiskowa $ CLASSPATH nie jest pusta, jednak gdy jest pusta, po prostu pozostawia ciągnący się dwukropek, który wkręca twoją ścieżkę klasy. Zmieniłem wiersze powyżej tego:

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

i również przeszedł środowiska ZOO_LOG_DIR dla ZK, ponieważ zkServer.sh generuje -Dzookeeper.log.dir VM argumentu podczas uruchamiania ZK. Oto polecenia, które uruchamia Heca dla mnie, sprawia, że ​​czytać /opt/zookeeper/conf/log4j.properties i przechowywać logi w/opt/Zimbra/log:

ZOO_LOG_DIR=/opt/zimbra/log /opt/zookeeper/bin/zkServer.sh start 
1

Innym rozwiązaniem, aby zmienić katalog pliku dziennika za pomocą zmiennej środowiskowej ZOO_LOG_DIR jest stworzenie własnego ZK-server-1/conf/zookeeper-env.sh.

Odczytywanie skryptów zookeeper-3.4.6 dist bash (t.i.zkEnv.sh) powoduje pobranie pliku zookeeper-env.sh, jeśli istnieje. Tutaj jest to (moja stworzony) Zawartość:

export ZOO_HOME=$ZOOKEEPER_PREFIX 
echo $ZOO_HOME 
export ZOO_LOG_DIR=$ZOO_HOME/logs 

jestem przyzwyczajony do posiadania productName _HOME zmienną, która wskazuje na górę katalogu instalacyjnym Heca. Ten top dir wydaje się być nazwany $ ZOOKEEPER_PREFIX przez zookeeper dist, który ja aliasuję z $ ZOO_HOME i używam go dla zmiennej środowiskowej ZOO_LOG_DIR.

Na końcu tego postu zbuforowałem informacje o debugowaniu skryptów bash - pomaga mi w badaniu, które środowisko lub zmienne lokalne są używane.

Jak widać, katalog /home/joma/dev/programme/zk-local-ensemble/zk-server-1/bin/../conf znajduje się na ścieżce CLASSPATH, stąd plik log4j.properties jest kwalifikuje się do ładowania zasobów przez moduł ładujący klasy java dla frameworka log4j (w taki sposób implementowany jest 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 
+0

BTW, jako użytkownik i twórca oprogramowania, jestem całkowicie "wahtthebliepisgoingonhereshowmethelogs". zookeeper powinien potoczyć bash err/sysout do jakiegoś boot.log do momentu, gdy log4j uruchomi się. Przygotuj standardową log4j.properties, aby przekierować err/sysout do appendera plików. –

+0

BTW2, i umieść standardowy program do przekazywania plików log4j.properties w trybie dołączania! –

4

zkServer.sh dostaje to zmienne środowiskowe z zkEnv.sh Plik env ustawia ścieżkę klasy, który zawiera plik log4j czy to w oczekiwanym miejscu.

ZOOXFGDIR=ZOOBINDIR/../conf

rzuciłem jakieś echo w zkServer.sh śledzić co się dzieje. Znalazłem, że ścieżka klas została ustawiona prawidłowo, ale nie ustawiono logdir i log4j_prop. Więc dodałem je do zkEnv.sh. Dzienniki są teraz wyświetlane w oczekiwanej lokalizacji.

ZOO_LOG_DIR="/var/log/zookeeper" 
ZOO_LOG4J_PROP="INFO,ROLLINGFILE" 
+0

Krótkie i wyraźne! –

0

Może nie szukał odpowiedzi, ale dla Heca-3.4.11 w katalogu conf można ustawić na odpowiednich poziomach oraz konfigurację w log4j.properties plików