使用知乎kids日志系统
2016-08-01
KIDS项目介绍:https://github.com/zhihu/kids
kids是知乎开源的分布式日志聚合系统,是「Kids Is Data Stream」的递归缩写,采用 Scribe 的消息聚合模型和 Redis 的 pub/sub 模型。有以下特点:
1.实时订阅
2.分布式收集、集中存储
3.多线程模型
4.使用redis协议
5.无第三方依赖
一.kids安装
wget https://codeload.github.com/zhihu/kids/tar.gz/1.0.0
tar -zxvf 1.0.0
cd kids-1.0.0/
./autogen.sh
./configure # –prefix=/your/path
make
make test #optional
make install
默认情况下,kids会被安装到/usr/local/bin/kids
下,如果需要按照在别的目录下,使用 –prefix
选项设置指定的安装位置,运行 ./configure –help
获取更多设置选项。
二.启动kids
kids的启动方式很简单kids -c xxxx
即可。
三.关于配置文件
nlimit pubsub 32MB 16MB 10min;
worker_threads 3; # worker线程的数量,server除此之外还会有1个负责调度的master线程和1个storer线程,对于 agent 一般只需要一个工作线程,将其设为 CPU 核数 – 1 能最大化 server 的处理能力
max_clients 20; # 每个host的最大连接数,当 host 的连接数超过该值后,新建立的连接会被强制 close
log {
level info; # Kids 自身的 log 等级,Level 可以根据以下状态设置debug, info, warning, error, critical, fatal。Debug 模式需要在编译时定义 LOGDEBUG
file /data/logs/kids/kids.log; #日志文件的存放位置, 设置为 stderr 会直接输出至命令行
}
listen {
host 127.0.0.1; # 监听host(本机这个可以不写)
port 9876; # 监听端口
socket /data/logs/kids/kids.sock;
}
store file { # 日志存储方式
path /data/logs/kids/[topic]/[date];
name [time].log;
rotate 1hour; # 时间单位支持hour与min
# 采用该配置后,kids 会将日志按照 /topic/date/time.log 的形式存储,每小时进行一次文件的切分
}
关于其他配置文件中的配置
1.网络存储,将日志通过网络转发给指定机器
store network {
host xxx;
port xxx;
}
2.空存储,不会对指定的日志进行任何存储,可与其它存储组合对指定日志进行过滤
store null {
topic kids.inoretopic; # 忽略kids.inoretopic的存储
}
3.日志按照配置文件中的顺序尝试存储,如果某一存储方式存储成功,则不再继续对该日志进行后续存储 采用该配置后 kids 会忽略 kids.ignoretopic1 与 kids.ignoretopic2 的存储,对于其他 topic,会转发至 kidsserver:3388,若转发失败,会保存到指定文件中。
store priority {
store null {
topic kids.ignoretopic1;
topic kids.ignoretopic2;
}
store network {
host kidsserver;
port 3388;
}
store file {
path /path/to/logs/[topic]/[date];
name [time].log;
rotate 1hour;
}
}
4.BufferStore 使用 Primary 与 Secondary 两级存储, 当 Primary 存储出现异常时,会将日志缓存至 Secondary 存储中,当 Primary 恢复后,会将 Secondary 中的缓存重新存储至 Primary
store buffer {
store network primary { # primary
host kidsserver;
port 3388;
}
store file secondary { # secondary
path /data/kidsbuf;
rotate 5min;
}
}
5.MultipleStore 会将日志存储至多个位置,通过定义 success 的类型,判断存储的成功与失败。 success 的值可选 any 或者 all。
store multiple {
success any;
# master
store buffer {
store network primary {
host kidsserver;
port 3388;
}
store file secondary {
path /tmp/kidsbuf;
rotate 10min;
}
}
# backup
store buffer {
store network primary {
host kidsbackup;
port 3388;
}
store file secondary {
path /tmp/kidsbuf2;
rotate 10min;
}
}
}