フタなしカンヅメ

徒然なるままに @happytar0

Scribeでログの集約・収集【追記】

あとがきでログを取る際の負荷が高いということを書いたのですが、もう一つのWebサーバ(lighttpd)でもログを取るようにしたところ、あまりにもレスポンスが遅くなってしまったので、Pythonで書き直してみました。といってもサンプルファイルをちょっといじっただけ・・・。

## /usr/local/bin/scribe_httpd2
#!/usr/bin/python

import sys
from scribe import scribe
from thrift.transport import TTransport, TSocket
from thrift.protocol import TBinaryProtocol

if len(sys.argv) == 2:
  category = sys.argv[1]
  host = '127.0.0.1'
  port = 1463
elif len(sys.argv) == 4 and sys.argv[1] == '-h':
  category = sys.argv[3]
  host_port = sys.argv[2].split(':')
  host = host_port[0]
  if len(host_port) > 1:
    port = int(host_port[1])
  else:
    port = 1463
else:
  sys.exit('usage (message is stdin): scribe_cat [-h host[:port]] category')

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)

transport.open()

while 1:
  message = sys.stdin.readline()
  log_entry = scribe.LogEntry(dict(category=category, message=message))
  result = client.Log(messages=[log_entry])

transport.close()

scribe_httpdを置き換えるだけで動作しますが、lighttpdの場合ログ用のプロセスは終了してくれないようなので自分で終了させる必要がある?ようです。たぶんスクリプトの書き方がおかしいんだと思います。ループしてるところで終了イベントを拾って処理してあげたりする必要があるのかな・・・?よくわからないので下のようにして強引に。

killall scribe_httpd2

これでだいぶレスポンスが早くなりました。