以下に公開しました。
試作版です。とりえあずiOSビルドだけで確認しました。
下図は有能なUUIDv4オブジェクトが無限に株式会社はてなに入社してゆく様子です*1。
//#import <CocoaFluentLogger/CocoaFluentLogger.h> CocoaFluentLogger* logger = [[CocoaFluentLogger alloc] initWithHost:@"192.168.0.9" port:24224 tagPrefix:@"debug"]; [logger connect]; while(1) { NSString* user = [[[NSUUID UUID] UUIDString] stringByReplacingOccurrencesOfString:@"-" withString:@""]; [logger post:@"test" object: @{@"message": [NSString stringWithFormat:@"id:%@ が株式会社はてなに入社しました", user]}]; } //[logger disConnect];
実装詳細
fluentdのforward Input Pluginの仕組みを利用してTCPソケットに接続してMessagePackバイナリを送りつけます。
MessagePackのObjective-Cライブラリは以下で公開されています。
課題
- 毎回接続するのはアレなのでデフォルトロガーをメモリ上に保持できるAPIは必要かも
- 既存のNSLogにモンキーパッチングしてFluentLoggerを差し込むのを良さそう
- iOSではVoIPを使うようにした方がよさそう
VoIPを使う
NSInputStream、NSOutputStream、CFStream、NSURLConnectionの各APIには、VoIP(Voice over InternetProtocol)通信の機能が組み込まれています。TCP接続をVoIP用として登録すれば、アプリケーションが一時停止していても、このソケットにデータが届くと再開されるようになります。
- 既存アプリに組込む場合のオーバーヘッド、ネットワークが不安定になったりしないの?
- リモートにログを送信する用途に見えるけど、アプリに仕込んだらマルウェアだとかキーロガーだとかいわれないの?
- 条件としてはHTTPでデバイス情報POSTするのとかとそんなに変らないと思うので、そもそも機密情報送信しない、もしくは送信する内容の開示と同意と得るなどの、ユーザーに誠実なUXを施すなどをすればいいと思う。
- また各種クラッシュログ送信SDK、TestFlightの本番運用用のSDK、Google Analytics SDKなどの利用解析要のツールも同様の問題を抱えていると思われる
- セキュアな通信への対応
- OS Xへの対応
- Objective-Cエキスパートのコードレビュー
思い付くだけ書いてみた。ご意見お待ちしております。