読者です 読者をやめる 読者になる 読者になる

Scribeを使ってアクセスログを集約する

CentOS Scribe

Webサーバーが複数台あって、そいつらからアクセスログを集めてきてアクセス解析を行いたい時、2010年にもなってlogrotateをかけた後にrsyncするのかなぁと思ってしまうわけです。

そういう用途にはFacebookで鍛え上げられたScribeが一番いいと分かっていながら、インストールが非常に面倒なので躊躇していました。./configure && make installでインストールするのも面倒ならば、RPMを作るのはさらに面倒。(Thriftはまだ何とかなるが、fb303、Scribeは本当に面倒)

しかし、偉大な先人はすでにいるものです。「scribe centos」とかでググってCentOS用のSRPMを作っている人を見つけました。

少しバージョンが古いものの、ここで公開されているThrift, fb303, ScribeのSRPMをリビルドして入れればサクッと入ります。/etc/scribed/default.confを適宜編集して起動。

$ sudo /sbin/service scribed start

Apacheからこのscribedサーバーにログを送るには、mod_log_scribeなるものを見つけたのですが、これまたRPMにするのが面倒なので、今のところはPythonスクリプトでお茶を濁すことにします。

#!/usr/bin/python
from scribe import scribe
from thrift.transport import TTransport, TSocket
from thrift.protocol import TBinaryProtocol

category = 'apache'
host = '127.0.0.1'
port = 1463

socket = TSocket.TSocket(host=host, port=port)
transport = TTransport.TFramedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(trans=transport, strictRead=False, strictWrite=False)
client = scribe.Client(iprot=protocol, oprot=protocol)

try:
  transport.open()
  while 1:
    line = sys.stdin.readline()
    log_entry = scribe.LogEntry(dict(category=category, message=line.rstrip()))
    result = client.Log(messages=[log_entry])
finally:
  transport.close()

このファイルを/usr/sbin/scribe_accesslogのような場所に保存して、httpd.confの中で、

CustomLog "|/usr/sbin/scribe_accesslog" combined

のようにしてパイプ経由でアクセスログを出力。httpd.confの方でscribedのホストやポート番号、ログカテゴリを指定できるように、もう少しちゃんとスクリプト書いてやった方がいいだろう。

どれくらいのスループットが出るのかとか、Scribedサーバーの側ではHadoopで処理しやすいようにhdfsの設定をしておくのかなぁ、とかまだ分からないことは多々ありますが、まあ取っ掛かりとしては今日はここまでかなと。

ちなみにGearmanの中の人は、「Gearmanを使えばWebサーバーのアクセスログの集約が簡単にできるぜ!」みたいなことを言っているけど、簡単なのは認めるがそれはどうかなぁ・・・