我想补充一下我是如何解决这个问题的/自定义我的环境的。
这里有两种日志机制:
- bin/zkServer.sh 将zookeeper服务器的stdout和stderr重定向到zookeeper.out
- log4j 可以将日志附加到多个位置,包括:
- CONSOLE - 最终出现在 zookeeper 服务器的 stdout 和 stderr 中
- ROLLINGFILE - 发送到 zookeeper.log
bin/zkServer.sh 使用:
- ZOO_LOG_DIR 为 zookeeper.out 和 log4j 设置路径。
- ZOO_LOG4J_PROP 设置 log4j 日志记录级别以及打开哪些日志附加程序
设置 conf/log4j.properties 中的“最终”默认值由 zookeeper bash 脚本组合设置:
- ZOO_LOG_DIR = . (启动 zookeeper 的工作目录)
- 在 conf/log4j.properties 中设置为 zookeeper.log.dir
- ZOO_LOG4J_PROP = 信息,控制台
- 在 conf/log4j.properties 中设置为 zookeeper.root.logger
打开日志附加器 CONSOLE 的效果是日志现在转到标准输出。因为 bin/zkServer.sh 将 stdout 和 stderr 重定向到 zookeeper.out,所以 log4j 日志最终在 zookeeper.out 中。关闭ROLLINGFILE的效果是没有创建zookeeper.log文件。
zookeeper.out 日志没有轮换。 zookeeper.log 日志设置为轮换,可以设置为过期旧日志。
我希望日志滚动并过期。我必须做的第一件事是更改 conf/log4j.properties 以导致旧日志过期/删除。我通过在 conf/log4j.properties 中设置 log4j.appender.ROLLINGFILE.MaxBackupIndex 来做到这一点。我要做的第二件事是设置日志目录、日志级别和附加程序。
我有一个每分钟运行一次的 bash 脚本。如果它看到 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 日志现在不再以 zookeeper.out 结尾。开启ROLLINGFILE的效果是zookeeper.log文件被创建、轮换、过期。
顺便说一句,conf/log4j.properties 显然已经在我的类路径中。在这方面我不必做任何改变。
这条链对我的理解做出了重大贡献:
https://groups.google.com/forum/#!msg/nosql-databases/aebIvNnT0xY/doky1X9-WfwJ