一尘不染

Zookeeper为什么不使用我的log4j.properties文件日志目录

linux

在我的zookeeper / conf / log4j.properties文件中,将zookeeper.log.dir设置为$ HOME / zklogs

当我使用zkServer.sh时,它不使用该目录。而是使用$ {ZOO_LOG_DIR},当我回显它时,它显示为“”。

我不了解如何解决此问题,也看不到任何地方设置的$ {ZOO_LOG_DIR}。我不确定如何将其设置为“。” 完全没有
我也不知道如何在没有zkServer.sh的情况下启动zookeeper。我对Linux也不太满意,在这个问题上有点迷失…

有人知道如何解决此问题,以便它使用在conf目录的log4j.properties文件中设置的目录吗?

***更新,我在zookeeper安装的bin目录中的zkEnv.sh中找到了。有代码:

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

我不确定第一行中发生了什么,但是必须在这里出问题了。我希望它能从我的log4j.properties文件中查看zookeeper.log.dir。谁能告诉我这是否正确?我不想只是硬着头皮在这里…


阅读 1285

收藏
2020-06-07

共1个答案

一尘不染

我想补充一下如何解决此问题/自定义环境。

这里有2种日志记录机制:

  • bin / zkServer.sh将zookeeper服务器的stdout和stderr重定向到zookeeper.out
  • log4j可以将日志追加到多个位置,包括:
    • 控制台-最终出现在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的效果是,日志现在转到stdout。由于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

2020-06-07