Zookeeper中如何解决zookeeper.out文件输出位置问题

 更新时间:2023年04月03日 10:06:49   作者:冷漠;  
这篇文章主要介绍了Zookeeper中如何解决zookeeper.out文件输出位置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用过 Zookeeper 的小伙伴都知道,Zookeeper 中运行日志 zookeeper.out 文件的输出路径默认为启动脚本的当前路径,导致Zookeeper 集群启动失败想看日志时总是不记得输出日志在哪儿,不方便查看日志文件,所以需要修改日志输出位置及方式,方便查看日志。

具体操作如下:

注释:以下所用 $ZOOKEEPER_HOME 为 Zookeeper 的根目录

修改 $ZOOKEEPER_HOME/bin/zkEnv.sh 文件

将 ZOO_LOG_DIR 设置成自定义路径,本次设置为 ${ZOOKEEPER_PREFIX}/logs,其中 ZOOKEEPER_PREFIX 变量是此脚本开头获取的 Zookeeper 的 bin 路径,我们直接以此来定位自己的日志路径即可。

具体如下:

# 修改前
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    ZOO_LOG_DIR="."
fi

# 修改后
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
#    ZOO_LOG_DIR="."
    # 自定义运行日志文件输出路径
    ZOO_LOG_DIR="${ZOOKEEPER_PREFIX}/logs"
fi

将日志文件写到 Zookeeper 安装目录下的 logs 文件夹中(logs 不需要创建,它会自己创建)。

这样在每次使用 zkSever.sh 的时候,都能将运行日志 zookeeper.out 输出到指定路径下,但这样配置有个问题,就是每次运行 Zookeeper 时,此日志都会被覆盖,而不是 append 到文件中,故每次运行结束后只会保存有本次运行日志,若单次运行时间很长也会导致日志文件也很大。

修改 $ZOOKEEPER_HOME/conf/log4j.properties 文件

在之前的配置中,我们只是实现了保存本次Zookeeper运行日志在指定路径下,这次我们通过配置 $ZOOKEEPER_HOME/conf/log4j.properties 来使用 log4j 日志框架将 Zookeeper 每次的运行日志都保存到指定路径下。

修改其中的 zookeeper.root.logger、zookeeper.log.dir 这两个参数。

具体如下:

# 修改前
zookeeper.root.logger=INFO, CONSOLE
zookeeper.log.dir=.

# 修改后
zookeeper.root.logger=INFO, CONSOLE, ROLLINGFILE
zookeeper.log.dir=/opt/module/zookeeper-3.4.10/logs

其中参数 zookeeper.root.logger 是设置日志优先级和打印方式,默认为控制台打印 CONSOLE,而在 zkServer.sh 中会启动后台命令,将控制台输出的日志输出重定向到 zookeeper.out 文件中。

修改后添加了滚动产生文件输出方式 ROLLINGFILE;通过参数 zookeeper.log.dir 设置日志文件 zookeeper.log 的存储路径,这里直接采用绝对路径,相对路径可能不识别;默认日志文件名为 zookeeper.log,其中所有参数都可以自定义修改。其余参数不再赘述。

修改 $ZOOKEEPER_HOME/bin/zkEnv.sh 文件

这里为什么又要修改 zkEnv.sh 文件呢?

因为 zkEnv.sh 文件中也有 log 文件的输出位置及方式,所以我们要将其中的 ZOO_LOG4J_PROP 设置成与 log4j 配置文件中相同,避免参数覆盖。

具体如下:

# 修改前
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    ZOO_LOG4J_PROP="INFO,CONSOLE"
fi

# 修改后
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
#    ZOO_LOG4J_PROP="INFO,CONSOLE"
    #自定义运行日志信息输出方式,增加了滚动输出的方式,初始只有控制台输出
    ZOO_LOG4J_PROP="INFO,CONSOLE,ROLLINGFILE"
fi

修改 $ZOOKEEPER_HOME/bin/zkServer.sh 文件

完成以上配置就可以将日志文件按照自己想要的方式输出,唯一美中不足的是在你设定的目录中,仍会有 zookeeper.out 文件存在, 虽然它的 size=0,究其原因是因为 zkServer.sh 会使用 nohup 进行 Zookeeper 的启动,然而 nohup 必然会输出一个日志文件到你设置的目录中,所以修改 _ZOO_DAEMON_OUT 此处的逻辑修改掉, 就可以将zookeeper.out了。

具体如下:

#修改前
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"

#修改后
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.log"

修改 $ZOOKEEPER_HOME/conf/log4j.properties 文件

上述日志配置是以日志文件大小轮转的,如果想要按照天轮转,可以将 log4j.appender.ROLLINGFILE 修改为 DaliyRollingFileAppender。

通过参数 log4j.appender.ROLLINGFILE.MaxBackupIndex 设置最大日志数量,每个日志文件大小最大默认为 10MB,以此文件大小进行分割。

具体如下:

# 修改前
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

# 修改后
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROLLINGFILE.MaxBackupIndex=10

DailyRollingFileAppender特点是固定周期时间生成一个日志文件,比如,默认情况是每天生成一个文件。

这种日志可以方便根据时间来定位日志位置,使日志清晰易查。但是这种日志有个不好地方是,不能限制日志数量,MaxBackupIndex 属性和 MaxFileSize 在DailyRollingFileAppender 中是无效的,这个还是按照自己的需求来定!

当然还有其他一些参数:

log4j.appender.ROLLINGFILE.File=zookeeper.log
## 按照什么频率滚动文件:yyyy-MM(每月)、yyyy-ww(每周)、yyyy-MM-dd(每天)、yyyy-MM-dd-a(每半天)、yyyy-MM-dd-HH(每小时)、yyyy-MM-dd-HH-mm(每分钟)
## 此处文件名为zookeeper.log.yyyy-MM-dd,最新文件名为zookeeper.log
log4j.appender.ROLLINGFILE.DataPattern='.'yyyy-MM-dd
log4j.appender.ROLLINGFILE.encoding=UTF-8
## 是否启动追加模式,默认为true,false为覆盖
log4j.appender.ROLLINGFILE.Append=false

补充

修改原始输出逻辑,不再将本次运行日志信息所有输出到 zookeeper.out 中,而是使用log4j框架输出到 zookeeper.log 中,便于管理。而 zookeeper.out 只用于输出标准错误。

具体如下所示:

注意:要想实现此处操作,上述 _ZOO_DAEMON_OUT=“$ZOO_LOG_DIR/zookeeper.out” 不能修改为 _ZOO_DAEMON_OUT=“$ZOO_LOG_DIR/zookeeper.log”

# 修改前
141     nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
142     -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

# 修改后: 将原始指令注释,设置新的输出逻辑,只将标准错误输出到zookeeper.out中.
141 #    nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
142 #    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
143     nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
144     -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" 2> "$_ZOO_DAEMON_OUT" 1> /dev/null &

这样就能保证历史运行日志都能输出到指定文件夹中,并且不会因为运行日志文件堆积造成负载点爆炸。

而标准错误都会输出到 zookeeper.out 文件中,和运行日志放置在同一文件夹中。

当需要查看脚本命令错误时,可以查看 zookeeper.out 文件,当需要查看程序错误时就查看 zookeeper.log 运行日志文件。

需要注意的是:每次启动 Zookeeper 时,都会覆盖 zookeeper.out 文件,所以要做重启处理时记得备份文件。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis 自动映射(使用需谨慎)

    Mybatis 自动映射(使用需谨慎)

    这篇文章主要介绍了Mybatis 自动映射(使用需谨慎),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • JSP页面传参出现中文乱码的解决方案

    JSP页面传参出现中文乱码的解决方案

    这篇文章主要介绍了JSP页面传参出现中文乱码的解决方案,非常实用,需要的朋友可以参考下
    2014-08-08
  • IDEA高效查看源码的快捷键及小技巧

    IDEA高效查看源码的快捷键及小技巧

    本篇文章这一部分的内容主要为大家介绍了一些平时看源码的时候常用的快捷键/小技巧!非常好用!掌握这些快捷键/小技巧,看源码的效率提升一个等级
    2022-01-01
  • 深入理解Java强依赖和弱依赖

    深入理解Java强依赖和弱依赖

    本文主要介绍了深入理解Java强依赖和弱依赖,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-11-11
  • Jmeter跨线程组共享cookie过程图解

    Jmeter跨线程组共享cookie过程图解

    这篇文章主要介绍了Jmeter跨线程组共享cookie过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 使用dom4j解析xml文件,并转出json格式问题

    使用dom4j解析xml文件,并转出json格式问题

    这篇文章主要介绍了使用dom4j解析xml文件,并转出json格式问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java Hibernate中一对多和多对多关系的映射方式

    Java Hibernate中一对多和多对多关系的映射方式

    Hibernate是一种Java对象关系映射框架,支持一对多和多对多关系的映射。一对多关系可以使用集合属性和单向/双向关联来映射,多对多关系可以使用集合属性和中间表来映射。在映射过程中,需要注意级联操作、延迟加载、中间表的处理等问题
    2023-04-04
  • springBoot中的properties配置解析

    springBoot中的properties配置解析

    这篇文章主要介绍了springBoot中的properties配置解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • JSON反序列化Long变Integer或Double的问题及解决

    JSON反序列化Long变Integer或Double的问题及解决

    这篇文章主要介绍了JSON反序列化Long变Integer或Double的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java高级架构之FastDFS分布式文件集群详解

    Java高级架构之FastDFS分布式文件集群详解

    这篇文章主要介绍了Java高级架构之FastDFS分布式文件集群详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04

最新评论