Objective-C版のfluent-loggerをつくりました

以下に公開しました。

試作版です。とりえあず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の本番運用用のSDKGoogle Analytics SDKなどの利用解析要のツールも同様の問題を抱えていると思われる
  • セキュアな通信への対応
  • OS Xへの対応
  • Objective-Cエキスパートのコードレビュー

思い付くだけ書いてみた。ご意見お待ちしております。