/airlogger

Simple remote console log viewer for iOS using node.js

Primary LanguageObjective-COtherNOASSERTION

AirLogger - A simple remote console log viewer for node.js (server) and iOS (client) by @c0diq

MOTIVATION
==========
At MOG, I needed a way to debug iOS apps while connected to a USB accessory or video out display.
In this situation, it's not possible to debug an app or accessing the device console. 
The only choice is to disconnect the device from the accessory and connect it 
back to the computer to analyze the console log which is very time consuming.

The idea here is to have a background app (AirLogger) that fetches console log entries and send them
in real time over WiFi to another machine while the device stays connected to the accessory
with the monitored app running in the foreground.

OVERVIEW
========

The system consists of 2 components:

- A Server to receive log entries from clients. 
I chose a leverage a simple and robust pubsub fanout messaging server for node.js written by @jazzychad
https://github.com/c0diq/fanout.node.js

Since I didn't want to have to enter the IP address of the server in the client, 
I've also added Bonjour announcement using node_mdns for node.js by @agnat
https://github.com/agnat/node_mdns

- A Client iOS app that runs in the background and uses ASL C functions to access
the iOS console log entries. Interestingly these are public APIs. As you know, a vanilla iOS app
can run in the background in iOS4 and above for only up to 10 minutes. For more time, 
a trick used here is to pretend to need background audio and play silence.
DISCLAIMER: This will not be approved by Apple. Don't try to submit your app with this trick. 

[The original fanout server separated clients (subscribers) from controllers (publishers). This version
doesn't differentiate the two different types. All clients can publish and subscribe in the airlogger model.
This allows a client to not only send logs but in the future, receives commands as well.]

SETUP
=====

The airlogger fanout pubsub system consists of three parts
 o The "airlogger server" itself
 o One or more "Clients" (message subscribers/publishers)

The airlogger server is run as a node.js process. Clients connect to the server on
the client port (default 1986).

Clients can do 5 (five) things:
 o Subscribe to message channels
 o Unsubscribe from message channels
 o Receive messages on subscribed message channels
 o Ping the fanout server for the current unix millitime
 o Send (publish) messages on message channels

Upon connection, each Client is automatically subscribed to the "all" message
channel, so that if another Client publishes a message to the "all" message
channel, each Client will receive it. This is useful for sending system-wide
messages to all connected clients. Clients can choose to unsubscribe from the
"all" channel if they so choose. Also upon connection, each client will receive
a message on the "debug" message channel notifying them that they have connected
to the server.
  
USAGE
=====

Assuming you have installed node.js on your machine/server, all you need 
is this:

  node Server/airlogger.js

Alternatively, you can install airlogger using npm:

  npm install airlogger

NOTE:
Using npm will take care of installing all the dependencies (fanout, mdns, winston)

To start sending log entries, open the AirLogger.xcodeproj in XCode and deploy to your iOS device
The App starts looking for _airlogger._tcp mdns services on the network.

If your iOS device and airlogger server machine are on the same network, the server
should appear in the list of available servers. All console log entries will
immediately be sent to the selected server.

You can then background the AirLogger app and launch the app you want to monitor.

Log entries are sent by the iOS client using the following format:
<facility> <Message>

Thus if you're interested in filtering out only certain messages (your app typically),
identify the facility name and do the following:

Open a new terminal and type:
> netcat localhost 1986
> subscribe <facility>

Where <facility> is typically your app bundle id.

EXTRA
=====

You want to write your own client? No problems.
All you need to do is open a tcp connection to the airlogger server and start
publishing messages in the following format:

  <facility><space><message><newline>
  
Connection from web browsers can be accomplished by using 
the TCPSocket abstraction in the Orbited.org project.