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

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です