あとがきでログを取る際の負荷が高いということを書いたのですが、もう一つの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
これでだいぶレスポンスが早くなりました。