zookeeper日志清理
环境
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日志清理的更多相关文章
- ZooKeepr日志清理【转】
转自 :@ni掌柜nileader@gmail.com 地址 数据文件管理 默认情况下,ZK的数据文件和事务日志是保存在同一个目录中,建议是将事务日志存储到单独的磁盘上. 1 数据目录 ZK的数据目录 ...
- ZooKeepr日志清理(转)
转载请用注明:@ni掌柜 nileader@gmail.com 在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默 ...
- 跨平台日志清理工具 Log-Cutter v2.0.1 正式发布
Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...
- 跨平台日志清理工具 Log-Cutter v2.0.1 RC-1 发布
Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...
- 跨平台日志清理工具 Log-Cutter v1.0.3 正式发布
Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...
- 【转】flume+kafka+zookeeper 日志收集平台的搭建
from:https://my.oschina.net/jastme/blog/600573 flume+kafka+zookeeper 日志收集平台的搭建 收藏 jastme 发表于 10个月前 阅 ...
- zookeeper定时清理log
在zookeeper的目录下新建一个脚本,内容如下(zookeeper bin下面也有zkCleanup.sh脚本,原理一样,都是调用java类) shell_dir=$(cd ")&quo ...
- mysql日志清理
mysql bin-log 日志清理 发现mysql数据库目录中bin-log中日志文件非常大 [root@localhost var]# du -sh mysql-bin* | sort 1020K ...
- zookeeper 日志输出到指定文件夹
最近在研究Zookeeper Storm Kafka, 顺便在本地搭了一套集群, 遇到了Zookeeper日志问题输出路径的问题, 发现zookeeper设置log4j.properties不能解决日 ...
随机推荐
- excel之导出
1.Maven依赖的jar包 <dependency> <groupId>org.apache.poi</groupId> <artifact ...
- 洛谷P3250 网络 [HNOI2016] 整体二分
正解:整体二分+树状数组 解题报告: 传送门! 亲这里的建议是用整体二分呢 dbq最近看sd淘宝说话体看多了有点脑抽,,, 首先考虑如果是单组询问怎么做昂QAQ 考虑二分答案 对于所有比mid小的操作 ...
- C#图解:第七章
C#图解第七章:类和继承 1.类继承 通过继承我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展. 1.可以使用- 一个已经存在的类作为新类的基础..已存在的类称为基类(baseclass),新 ...
- Python日期与字符串互转
import datetime #str -> date detester = '2017-01-01' date = datetime.datetime.strptime(detester,' ...
- json传参 js前端和java后端 的简单例子
下面讲解了从前端js对象-->json字符串-->java字符串---->java map的过程 1,初始化js对象 var param = {}; param.krel = kre ...
- Py中axis理解【转载】
转载:https://blog.csdn.net/yaoqi_isee/article/details/77714570 1.理解 numpy当中axis的值表示的是这个多维数组维度的下标,比如有一个 ...
- Case when then esle end
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END --Case搜索函数 ' T ...
- Laravel中路由怎么写(一)
1.路由基本使用示例 1.1 默认示例 Laravel中所有路由定义在/app/Http/routes.php文件中,该文件默认定义了应用的首页路由: Route::get('/', function ...
- [LeetCode] questions conlusion_InOrder, PreOrder, PostOrder traversal
Pre: node 先, Inorder: node in, Postorder: node 最后 PreOrder Inorde ...
- inbox.MoveTo Folder does not move message out of inbox
inbox.MoveTo Folder does not move message out of inbox #160 Closed vnwind opened this issue on 14 M ...