序言php
它可以从各类日志源上收集日志,存储到一个中央存储系统(能够是NFS,分布式文件系统等)上,以便于进行集中统计分析处理。java
源码安装python
一、前提准备
c++
Scibe须要下面的依赖库,执行下面命令bootstrap
yum -y install gcc gcc-c++ m4 autoconf automake libtool libicu-devel python-devel libevent-devel byacc flex缓存
下面的比较全,不放心的话能够直接执行下面的ruby
yum install gcc-c++ libevent libevent-devel automake autoconf m4 bison zlib zlib-devel bzip2 bzip2-devel flex pkgconfig python python-devel ruby ruby-devel mono-devel libxml2 libxml2-devel ant openssl-devel bash
刷新动态连接库服务器
/sbin/ldconfig并发
二、准备安装包
演示以下版本
三、安装boost
tar -zxvf boost_1_44_0.tar.gz
cd boost_1_44_0
./bootstrap.sh --prefix=/usr/local/boost
./bjam -s HAVE_ICU=1 --prefix=/usr/local/boost
--includedir=/usr/local/boost/include
--libdir=/usr/local/boost/lib
(红色部分能够不配置)
./bjam install --prefix=/usr/local/boost
echo "/usr/local/boost/lib/" >> /etc/ld.so.conf
sudo /sbin/ldconfig
四、安装thrift
tar -zxvf thrift-0.8.0.tar.gz
cd thrift-0.8.0
./configure --prefix=/usr/local/thrift --with-csharp=no --with-java=yes
--with-erlang=no --with-perl=no --with-php=no --with-ruby=no
--with-py=yes --with-libevent --with-boost=/usr/local/boost/
(若是提示没有权限./configure 那么先把configure文件赋予可执行权限上述配置较多,可视状况而定。如:./configure --prefix=/usr/local/thrift --with-java=no --with-boost=/usr/local/boost --with-erlang=no --with-perl=no --with-php=no --with-ruby=no)
make && make install
echo "/usr/local/thrift/lib/" >> /etc/ld.so.conf
/sbin/ldconfig
五、安装thrift-fb303
cd thrift-0.8.0/contrib/fb303
./bootstrap.sh 执行后会出现configure可执行文件
./configure --prefix=/usr/local/thrift/fb303 --with-boost=/usr/local/boost/
--with-thriftpath=/usr/local/thrift/
make
若是报错多是以下修改方式:
/usr/local/thrift-0.8.0/contrib/fb303/cpp/gen-cpp/FacebookService.h 添加#include <stdint.h>
/usr/local/thrift/include/thrift/transport/TFDTransport.h添加了#include <stdint.h>
/usr/local/thrift/include/thrift/TApplicationException.h添加了#include <stdint.h>
/usr/local/thrift/include/thrift/protocol/TBinaryProtocol.h添加了#include <arpa/inet.h>
make install
注意:若是thrift和thrift-fb303没法安装的话那就换版本
六、安装Scribe
unzip scribe-master.zip (facebook-scribe-63e4824.tar 也是这个步骤)
cd scribe-master
./bootstrap.sh --with-boost=/usr/local/boost/ 执行后,会生成configure文件
./configure --prefix=/usr/local/scribe --with-boost=/usr/local/boost
--with-thriftpath=/usr/local/thrift
--with-fb303path=/usr/local/thrift/fb303
make
make install
至此/usr/local/scribe 目录建立则安装完成。
七、测试Scribe是否安装成功
将scribe-master/examples/下的example*.conf拷贝到/usr/local/scribe下这个是测试的配置文件。
将复制到/usr/local/scribe/bin下
(为了方便起见,能够讲example这个文件夹拷贝到本机上,方便之后使用)
启动scribe,默认是1463端口:
/usr/local/scribe/bin/scribed -c /usr/local/scribe/example1.conf
测试程序:
echo "hello world"| /usr/local/scribe/bin /scribe_cat test
查看结果:example1.conf配置的日志存放路径就是/tmp/scribetest
cat /tmp/scribetest/test/test_current
出现hello word则表示安装没有问题了。
八、还能够配置系统服务项
在/etc/init.d/下新建一个scribe文件
vi scribe
内容为以下:
#!/bin/bash
# chkconfig: - 80 12
# description: Distributed log daemon
# processname: scribe
# config: /usr/local/scribe/scribe.conf
# pidfile: /var/run/scribe.pid
source /etc/rc.d/init.d/functions
### Default variables
USER="root"
OPTIONS="-c /usr/local/scribe2/scribe.conf >> /dev/null 2>&1"
PORT="1464"
BIN="/usr/local/scribe2/bin"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="scribed"
desc="Distributed logging"
start() {
export BOOST_ROOT=/usr/local/boost2
export LD_LIBRARY_PATH=/usr/local/boost2/lib::/usr/lib:/usr/local/lib:/usr/local/thrift/lib
echo -n $"Starting $desc ($prog): "
# daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS
daemon $BIN/$prog -p $PORT $OPTIONS &
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Shutting down $desc ($prog): "
#killproc $prog
/usr/local/scribe2/bin/scribe_ctrl stop $PORT
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
restart() {
stop
start
}
reload() {
echo -n $"Reloading $desc ($prog): "
killproc $prog -HUP
RETVAL=$?
echo
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e /var/lock/subsys/$prog ] && restart
RETVAL=$?
;;
reload)
reload
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
chmod 755 scribe
这样就完成了系统服务项配置,若是安装路径跟此处不同,那么作相应修改
Chkconfig --add scribe
chkconfig scribe on
完成了开机系统配置
九、配置文件说明scribe.conf
1、全局配置项
port:指示scribe服务器在哪个端口上监听,默认是0,经过命令行参数选项-P
能够指定端口,也可以经过配置文件指定。
check_interval : 设置多长时间检测一次存储,默认值是5秒。
max_msg_per_second: 每秒最大日志并发数,默认为0,0则表示没有限制。
max_queue_site:队列最大能够为多少,默认为5,000,000 bytes。
在scribeHandler::Log中使用
max_conn:最大的连接数
new_thread_per_category:(yes/no)是否为每一个一个分类建立一个线程,为
no的话,只建立一个线程为每一个存储服务,
对于前缀存储或默认存储,若是这个参数设置成
“否”将致使全部匹配这个分类的消息都由一个单
独的存储来处理。不然将为每个惟一的分类名创
建一个新的存储。默认为“yes”。
num_thrift_server_threads:(number)接收消息的线程数,默认为3个
2、store
每一个store表明一个存储,就是一个日志,配置多个,表明配置了多种日志存储。
下面是store配置变量
1)、category(store三种存储分类)
Category其实就是给该配置的store起一个名字,经过category来肯定用哪一个
store配置,并且默认category的值就是生成的日志文件名。
有以下三种分类形式:
默认存储:默认分类存储,当不符合其余分类存储的状况下,默认调用该分类存储。
每一个scribe配置文件中仅可以出现一个默认存储即:category=default
若是此时写入的日志为category=abc,并且其余category都不匹配就会
执行default的配置,并且type=file,file_path=/var/log,那么日志
文件为/var/log/abc/abc_00000,即会为该日志建立一个文件夹,文件夹
名就是abc.
前缀分类:若是该分类存储是以*结尾的,那么该存储将处理全部以指定前缀开头的
category。 如:category=test*,那么test、test一、test_一、testxxx
等等都是属于该分类的存储。
多个类别:如categories=rock paper* scissors 中间用空格隔开,表示rock分
类,scissors分类,以及之前缀paper开头的分类都走该配置的store
在上面三种状况下,scribe将为每个惟一的category建立一个子目录,除非new_thread_per_category被设置为false。
2)、type(Store的存储类型)
有以下几种存储类型:
file、buffer、network、bucket、thriftfile、null、mutil。
3)、target_write_size
对应category的消息在处理以前,消息队列最大能够为多大。
默认:16,384 bytes
4)、max_batch_size
内存存储队列一次性能够处理的消息数量,超过这个大小将调用thrift。
默认:1,024,000 bytes
5)、max_write_interval
对应category的消息队列在处理消息这些消息以前能够维护多长时间
默认为1秒
6)、must_succeed
消息是否必需要成功处理,一个存储处理消息失败是否从新进入消息队列排队。若是设置为no,则若是一个消息存储失败,则该条消息会被抛弃.
强烈建议使用type=buffer store去指定一个secondary store去处理失败的消息
7)、更多配置,根据type不一样会有更多不一样的配置
type=file
1)file_path 经常使用
文件路径。默认为/tmp
如category=test 并且未配置file_path,则日志写入到
/tmp/test_00000。
2)base_file_name 经常使用
基本文件名,默认为category名字
如base_file_name=test,那么日志文件格式形式为:
test-2015-01-01_00000.当天的日志是test_00000
3)use_hostname_sub_directory:(yes/no) 通常不配置保持默认
是否使用服务器的hostname做为子目录,默认为no
如:category=test file_path=/tmp/scribe
若是主机名为zht,那么日志为:
/tmp/scribe/zht/test_00000
4)sub_directory: 经常使用
使用指定的名称来建立一个子目录,相似上面3)
不一样的是3)是使用主机名当子目录,4)这个建立子目录名称比较灵
活,本身指定名称。
如:category=test file_path=/tmp/scribe sub_directory=aqh
那么日志为/tmp/scribe/zht/test_00000
5)rotate_period 经常使用
多长时间建立一个文件。可选值为:
hourly:每一个小时
daily:天天
never:从不,默认
number[suffix]:其中suffix能够为s,m,h,d,w,对应秒,分钟,小时,天,星
期,默认为s
6)rotate_hour 经常使用
取值为0-23,默认为1
若是rotate_period=daiy,这个就决定天天的何时建立新文件。
如:rotate_period=daily
rotate_hour=2
表示天天2点生成新的日志文件
7)rotate_minute 经常使用
取值0-59,默认是15
若是rotate_period=daily或hourly,这个决定天天或者每小时的哪一个
分钟建立新文件
如:rotate_period=hourly
rotate_minute=10
表示每小时的十点建立新文件
8)max_site:(bytes) 通常不配置保持默认
文件大约到多大时写入到一个新的文件
默认为1,000,000,000
9)write_meta:(yes/任何其余值) 通常不配置保持默认
是否写入元数据,若是是yes,则一个文件的最后一行为write_meta加下一个文件名。默认为no|false
10)fs_type:(std/hdfs) 经常使用
文件系统类型,有std和hdfs
默认为std
11)chunk_size:(number) 通常不配置保持默认
chunk大小,若是指定了则文件内的任何消息都不会越过这个数值,
除非消息自己比chunk大,默认为0
12)add_newlines:(0/1) 通常不配置保持默认
1表示之后的每个消息都写入一个新行,每写入一个消息就新增
一行,默认为0
13)create_symlink:(yes/no) 通常不配置保持默认
若是为yes,则会有一个符号连接指向当前写入的文件
默认为yes
如:category=test ,当create_symlink=yes时 就会出现下面的test_current。若是为no就没有这个了
14)write_stats:(yes/no) 通常不配置保持默认
是否会为每个store建立一个scribe_stats文件去跟踪文件写
默认为yes
15)max_write_size:(byte) 通常不配置保持默认
当块大小大到max_write_size时,store会将数据刷新到文件系
统,max_write_size不能超过max_site.因为target_write_size大小
的消息被缓存,file-store会被调用去保存这些缓存中的消息.file-
store每次最少会保存max_write_size大小的消息,但file-store最
后一次保存消息的大小确定会小于max_write_size.
默认值为1,000,000
type=network
此时scribe能够向其余机器的scribe发送消息,scribe会保持长链接到其
他scribe,除非发生错误或者超载才会从新链接。在正常运行的状况下,scribe会基
于当前缓存中存在多少条消息等待发送而分批次的发送。
1)remote_host 经常使用
要发送到的scribe服务器的主机名或者ip
2)remote_port 经常使用
要发送到的scribe服务器的端口
3)timeout:(毫秒) 通常不配置保持默认
socket超时时间
默认为5000,对应DEFAULT_SOCKET_TIMEOUT_MS变量
4)use_conn_pool:(yes/no) 通常不配置保持默认
是否使用链接池
默认为false
type=buffer 较为经常使用的store存储
这是最经常使用的一种store,该store包含两个子store,其中一个是primary
store,另外一个是secondary store。这两个子store的配置参数跟store同样。即:
<store>
……. 1
<primary>
…….. 2
</primary>
<secondary>
…….. 3
</secondary>
</store>
日志会先尝试将消息写到primary,若是写入不成功会暂时写到secondary
里,一旦primary恢复正常,buffer-store会从secondary读取消息再发送到
Primary(除非replay_buffer=no)。其中,secondary仅支持两种type:file null。
Primary和secondary节点立面配置的内容就是type=xxx,以及xxx的参数配置
下面是配置参数是配置在上面配置形式中1位置上的内容。
1)buffer_send_rate:(number) 经常使用,基本为1
每次check_interval周期内,执行多少次将secondary-store的数据
发送到primary-store
默认为1
2)retry_interval:(second) 经常使用
写primary失败后,等待多久从新发送primary中数据
默认为300秒
3)retry_interval_range:(second) 经常使用
在retry_interval范围内随机产生一个时间间隔从新发送
默认为60
4)replay_buffer:(yes/no) 通常保持默认不配置
若是设置为yes,会将失败的消息从secondary移到primary中
若是设置为no不从secondary移除消息而且发送到primary 中 默认为yes
type=null
忽略指定category的消息,没有参数
如:以tps_report开头的消息,将被忽略
<store>
category=tps_report*
type=null
</store>
type=bucket
bucke能够理解为并行store,会经过每个消息的前缀做为key散列以后写到多个文件.你能够隐式(只使用一个bucket定义)或显式的定义bucket(每一个bucket使用一个bucket定义).隐式定义的bucket必须有一个名为bucket的子store,而且这个子store的type只能是file、network、thriftfile
1)num_buckets
多少个bucket,若是消息没法hash则会放入一个编号为0的bucket
默认为1
2)bucket_type:
bucket类型, 取值为:key_hash,key_modulo,random
3)delimiter
第一次出如今消息前缀中的delimiter在key_hash或key_modulo
中被看成key。random不会使用delimiter.
必须是1-255之间的ascii代码,不然默认是‘:’
4)remove_key:(yes/no)
若是为yes,则会删除每一个消息的前缀key
默认为false
5)bucket_subdir
若是是使用单个bucket定义即只出现一个<bucket>,则每一个文件的
子目录名字为该值加bucket的hash编号,此时该项必须配置。
若是为有num_bucket为n个并且出现n个<bucket>那么能够不配
置该项
注意:无论num_buckets为多少,都会出现一个编号为0的目录,出现这个目录
目的是,当消息没法hash后,默认放到这个编号为0的目录中。
<store>
category=bucket_me type=bucket num_buckets=2
bucket_subdir=bucketdir bucket数量为2,并且下面只有一个<bucket>那么此项必须配
bucket_type=key_hash delimiter=58
<bucket>
type=file fs_type=std
file_path=/tmp/scribetest base_filename=bfn
</bucket>
</store>
这样配置结果是:/tmp/scribetest目录下出现三个
其中000是默认会建立的,001和002就是配置的num_buckets=2
在三个目录下会有日志文件fbn_00000
<store>
category=bucket_me type=bucket num_buckets=2
bucket_type=key_hash 下面为每个bucket都配置了那么就不用配置bucket_subdir
<bucket0>
type=file fs_type=std file_path=/tmp/scribetest/b0
base_filename=bucket0
</bucket0>
<bucket1>
type=file fs_type=std file_path=/tmp/scribetest/b1
base_filename=bucket1
</bucket1>
<bucket2>
type=file fs_type=std file_path=/tmp/scribetest/b2
base_filename=bucket2
</bucket2>
</store>
这样配置在/tmp/scribetest出现了
type=multi
multi-store会将消息存储到它的多个子store中.一个multi-store有多个子store,命
名为store0,store1,store2等,个数任意.其实就是把日志向多个地方同时打印,一条日
志存储在多
个日志文件中。
1)report_success:(all/any)
是否全部子sotre存储成功再报告为成功仍是只要任何一个子sotre存储成
功就回报为成功,默认为all
如:
<store> category=mu type=multi
<store0>
type=file
file_path=/tmp/store0
</store0>
<store1>
type=file
file_path=/tmp/store1
</store1>
</store>
运行后会出现以下结果:在/tmp下有
每一个文件夹下有mu_00000日志文件,用于存储
当echo "loglog" | /usr/local/scribe/bin/scribe_cat mu会想着两个日志文件存储消息。
若是配置更多的store3、store4…..那么就会出现更多的文件夹同时存储日志
type=thriftfile
thriftfile-store也是file的一种,只不过存储消息到的文件为TFileTransport文件
1)file_path
2)base_filename
3)rotate_period
4)rotate_hour
5)rotate_minute
6)max_site
7)fs_type
8)chunk_size
9)create_symlink
10)flush_frequency_ms: (毫秒)
多长时间同步thrift文件到硬盘
默认为3000毫秒
11)msg_buffer_site: (字节)
store将会拒绝存储大于msg_buffer_site
默认为0无限制
<store>
category=sprockets
type=thriftfile
file_path=/tmp/sprockets
base_filename=sprockets_log
max_size=1000000
flush_frequency_ms=2000
</store>
十、Scribe_ctrl命令介绍
scribe_ctrl status 若是服务器运行正常则返回'ALIVE'
scribe_ctrl version 返回当前Scribe服务器的版本、
scribe_ctrl alive 返回服务器运行时间
scribe_ctrl stop 中止Scribe服务器
scribe_ctrl reload 从新加载Scribe配置文件
scribe_ctrl counters 返回下列统计信息 (若是非零):
received good: 返回Scribe服务器启动后接收到的信息数
received bad: 接收到的非法信息数
sent:发送到另外一台Scribe服务器的信息数
denied for queue size: 因信息队列满被禁止的请求数
denied for rate: 因为速度限制而被禁止的请求数
retries: 缓冲储存重试发送一批消息的次数
requeue: Scribe发送消息到一个Store的次数 (若是must_succeed 启用).
lost: 没有记录的消息的数量。(推荐配置: 使用Buffer Stores 避免信息丢失)
received blank category: 接收到的没有信息类别的信息数量