环境
  Red Hat Enterprise Linux Server release 7.3 (Maipo)
  jdk1.7.0_80
      zookeeper-3.4.11

一、事务日志和快照日志
1.事务日志和快照日志概述
配置文件:/home/cluster/zookeeper/conf/zoo.cfg
事务日志目录:dataDir=/home/cluster/zookeeper/zkdata
快照日志目录:dataLogDir=/home/cluster/zookeeper/logs

事务日志,指zookeeper系统在正常运行过程中,针对所有的更新操作,在返回客户端“更新成功”的响应前,zookeeper会保证已经将本次更新操作的事务日志已经写到磁盘上,只有这样,整个更新操作才会生效,在/home/cluster/zookeeper/zkdata目录下生成一个version-2目录,该目录下面是一堆格式如log.****事务日志,文件大小为64MB,****表示写入该日志的第一个事务的ID,十六进制表示比如log.8cc70320908b。
快照日志,zookeeper的数据在内存中是以树形结构进行存储的,而快照就是每隔一段时间就会把整个DataTree的数据序列化后存储在磁盘中,这就是zookeeper的快照文件。在/home/cluster/zookeeper/logs目录下有一个version-2目录,下面是一对格式snapshot.**的快照文件,比如:snapshot.8cc703247dc2,其中**表示zookeeper触发快照的那个瞬间,提交的最后一个事务的ID。

2.事务日志可视化:事务日志为二进制文件,不能通过vim等工具直接访问。其实可以通过zookeeper自带的jar包读取事务日志文件。首先将libs中的slf4j-api-1.6.1.jar文件和zookeeper根目录下的zookeeper-3.4.11.jar文件复制到临时文件夹tmplibs中,然后执行如下命令:
java -classpath .:slf4j-api-1.6.1.jar:zookeeper-3.4.9.jar org.apache.zookeeper.server.LogFormatter ../Data/datalog/version-2/log.8cc70320908b

[cluster@PCS102 tmplibs]$ java -classpath .:slf4j-api-1.6..jar:zookeeper-3.4..jar  org.apache.zookeeper.server.LogFoatter   ../zkdata/version-/log.8cc705501505

// :: AM CST session 0x20309e8d8bd000f cxid 0x1004dee zxid 0x8cc705509109 create '/controller,#7b2276657273696f6e223a312c2262726f6b65726964223a302c2274696d657374616d70223a2231353430323337313138363837227d,v{s{31,s{'world,'anyone}}},T,21575201

// :: AM CST session 0x20309e8d8bd0010 cxid 0x2876033 zxid 0x8cc70550910a error -

// :: AM CST session 0x1006a28d0860051 cxid 0x170127f zxid 0x8cc70550910b error -

// :: AM CST session 0x20309e8d8bd000f cxid 0x1004df3 zxid 0x8cc70550910c setData '/controller_epoch,#3231353735313837,21575186

// :: AM CST session 0x20309e8d8bd000f cxid 0x1004e4c zxid 0x8cc70550910d delete '/controller

// :: AM CST session 0x20309e8d8bd0010 cxid 0x287603c zxid 0x8cc70550910e create '/controller,#7b2276657273696f6e223a312c2262726f6b65726964223a312c2274696d657374616d70223a2231353430323337313138373831227d,v{s{31,s{'world,'anyone}}},T,21575202

3.四种日志清理
3.1 使用定时删除日志脚本 推荐使用这一种 结合crontab,每天定时清理: 0 0 2 * * ? /home/cluster/zookeeper/bin/cleanuplog.sh

#!/bin/bash

#snapshot file dir
dataLogDir=/home/cluster/zookeeper/logs/version-
#transction file dir
dataDir=/home/cluster/zookeeper/zkdata/version-
#zk log dir
logDir=/home/cluster/zookeeper/logs
#保留最新的60个文件
count=
count=$[$count+]
##按照时间正序排列|展示从头开始第count行开始|传入执行参数
#事务日志
LOGNUM=`ls -l /home/cluster/zookeeper/zkdata/version-/log.* |wc -l`
if [ $LOGNUM -gt ]; then
ls -t $dataDir/log.* | tail -n +$count | xargs rm -f
fi #快照日志
SNAPSHOTNUM=`ls -l /home/cluster/zookeeper/logs/version-/snapshot.* |wc -l`
if [ $SNAPSHOTNUM -gt ]; then
ls -t $dataLogDir/snapshot.* | tail -n +$count | xargs rm -f
fi #zookeeper.log
ZKLOGNUM=`ls -l /home/cluster/zookeeper/logs/zookeeper.log.* |wc -l`
if [ $ZKLOGNUM -gt ]; then
ls -t $logDir/zookeeper.log.* | tail -n +$count |xargs rm -f
fi #zookeeper.out
if [ -e "$logDir/zookeeper.out" ]; then
rm -f /home/cluster/zookeeper/logs/zookeeper.out
fi

3.2 使用ZK的工具类PurgeTxnLog,它的实现了一种简单的历史文件清理策略,可以在这里看一下他的使用方法:http://zookeeper.apache.org/doc/r3.4.3/api/index.html,可以指定要清理的目录和需要保留的文件数目,简单使用如下
java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir><snapDir> -n <count>

3.3对于上面这个Java类的执行,ZK自己已经写好了脚本,在bin/zkCleanup.sh中,所以直接使用这个脚本也是可以执行清理工作的。

3.4从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置zoo.cfg中 autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:autopurge.purgeInterval 这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。autopurge.snapRetainCount 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。

二、zk运行日志 zookeeper.out和zookeeper.log
zkEnv.sh配置日志目录ZOO_LOG_DIR和log4j日志输出的配置ZOO_LOG4J_PROP

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="/home/cluster/zookeeper/logs"
fi #默认日志级别INFO,输出器是控制台
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,CONSOLE"
fi

zkServer.sh 配置日志文件名称和启动参数

if [ ! -w "$ZOO_LOG_DIR" ] ; then
mkdir -p "$ZOO_LOG_DIR"
fi #nohup日志输出
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out" nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" >& < /dev/null &

通过以上代码可以知道:zookeeper.out实际上是nohup的输出。而nohup的输出实际上是stdout,stderr的输出,可以使用 /home/cluster/zookeeper/bin/cleanuplog.sh一起清理

看下原来log4j配置,基本上没实际用处

#声明属性
zookeeper.root.logger=INFO, CONSOLE
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=INFO
zookeeper.tracelog.dir=.
zookeeper.tracelog.file=zookeeper_trace.log #
# ZooKeeper 日志配置 默认INFO级别 输出器CONSOLE
log4j.rootLogger=${zookeeper.root.logger} #控制台 info日志
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{}@%L] - %m%n #ROLLINGFILE appender
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
#每个日志文件最大多少
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
#最多几个文件
log4j.appender.ROLLINGFILE.MaxBackupIndex=
log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{}@%L] - %m%n #TRACE日志
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}
log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{}@%L][%x] - %m%n

现在我们改造一下,使用DailyRollingFileAppender每天生成一个文件

修改zkEnv.sh配置日志目录ZOO_LOG_DIR和log4j日志输出的配置ZOO_LOG4J_PROP

这样可以使用 /home/cluster/zookeeper/bin/cleanuplog.sh  一起清理

[cluster@PCS102 bin]$ vim zkEnv.sh
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,DAYROLLINGAppender"
fi
#声明属性
zookeeper.root.logger=INFO, DAYROLLINGAppender
zookeeper.log.dir=/home/cluster/zookeeper/logs
zookeeper.log.file=zookeeper.log # ZooKeeper 日志配置 默认INFO级别 输出器CONSOLE
log4j.rootLogger=${zookeeper.root.logger} #DAYROLLING appender
log4j.appender.DAYROLLINGAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAYROLLINGAppender.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.DAYROLLINGAppender.File=${zookeeper.log.dir}/${zookeeper.log.file}
log4j.appender.DAYROLLINGAppender.Threshold=INFO
log4j.appender.DAYROLLINGAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.DAYROLLINGAppender.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{}@%L] - %m%n

参考:

ZooKeepr日志清理【转】
ZK自动清理日志
zookeeper运维
修改Zookeeper输出日志 zookeeper.out输出路径

zookeeper日志清理的更多相关文章

  1. ZooKeepr日志清理【转】

    转自 :@ni掌柜nileader@gmail.com 地址 数据文件管理 默认情况下,ZK的数据文件和事务日志是保存在同一个目录中,建议是将事务日志存储到单独的磁盘上. 1 数据目录 ZK的数据目录 ...

  2. ZooKeepr日志清理(转)

    转载请用注明:@ni掌柜 nileader@gmail.com 在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默 ...

  3. 跨平台日志清理工具 Log-Cutter v2.0.1 正式发布

    Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...

  4. 跨平台日志清理工具 Log-Cutter v2.0.1 RC-1 发布

    Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...

  5. 跨平台日志清理工具 Log-Cutter v1.0.3 正式发布

    Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...

  6. 【转】flume+kafka+zookeeper 日志收集平台的搭建

    from:https://my.oschina.net/jastme/blog/600573 flume+kafka+zookeeper 日志收集平台的搭建 收藏 jastme 发表于 10个月前 阅 ...

  7. zookeeper定时清理log

    在zookeeper的目录下新建一个脚本,内容如下(zookeeper bin下面也有zkCleanup.sh脚本,原理一样,都是调用java类) shell_dir=$(cd ")&quo ...

  8. mysql日志清理

    mysql bin-log 日志清理 发现mysql数据库目录中bin-log中日志文件非常大 [root@localhost var]# du -sh mysql-bin* | sort 1020K ...

  9. zookeeper 日志输出到指定文件夹

    最近在研究Zookeeper Storm Kafka, 顺便在本地搭了一套集群, 遇到了Zookeeper日志问题输出路径的问题, 发现zookeeper设置log4j.properties不能解决日 ...

随机推荐

  1. 【Python爬虫】BeautifulSoup网页解析库

    BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

  2. (4.23)sql server区服大小写的检索

    是的,SQL Server数据库可以区分大小写.区分大小写意味着SQL Server将为CASE,Case,CaSe等返回不同的结果集,并将所提到的字符串视为3个不同的字符串.区分大小写的数据库具有区 ...

  3. 20170712 SQL Server 日志文件收索

    -- 1 日志文件增长过快,未进行任务计划截断备份 造成文件过大199G 左右,而可用空间不足8% -- 2 日志备份之前,需要一次完整备份 再进行截断备份 出现可用空间99% 此时可以选择收索数据库 ...

  4. 2 jmeter常用功能介绍-测试计划、线程组

    1.测试计划测试用来描述一个性能测试,所有内容都是基于这个测试计划的. (1)User Defined Variables:设置用户全局变量.一般添加一些系统常用的配置.如果测试过程中想切换环境,切换 ...

  5. 005-docker-镜像使用、拉取、运行、创建、打tag

    当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载. 1.列出所有本地镜像 docker images ...

  6. Trie树(转:http://blog.csdn.net/arhaiyun/article/details/11913501)

    Trie 树, 又称字典树,单词查找树.它来源于retrieval(检索)中取中间四个字符构成(读音同try).用于存储大量的字符串以便支持快速模式匹配.主要应用在信息检索领域. Trie 有三种结构 ...

  7. MRPT编译

    今天尝试编译一下MRPT,主要是为了学习里面的路径规划算法. 自主探索,未知环境探索...... 编译的过程中遇到一个问题就是wxWidgets老是检测不到,让我添加它的root目录.明明wxWidg ...

  8. linux命令注解

    参考: Linux命令实例练习 -- 实验楼 太懒,就不全抄了,把自己觉得有坑的地方记录下来. ls ls命令的20个实用范例 -- linux.cn 常用参数 参数 描述 -a –all 列出目录下 ...

  9. request.getSession(true)和request.getSession(false)的区别

    request.getSession(true)和request.getSession(false)的区别   request.getSession(true):若存在会话则返回该会话,否则新建一个会 ...

  10. git flow常用命令

    https://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html https://blog.csdn.net/shu580231/ ...