序言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: 接收到的沒有信息類別的信息數量