Logging api

Reviewers:  @bernerdschaefer, @peterbourgon 

First pass at the internals of the logging API.  This is two layers thick.  There is a RingBuffer for log messages, and on top of this is a data structure that implements storage for and operations for each container.  (The RingBuffer probably should have been a separate submit.)

The next piece to be worked on will be the HTTP logging interface.
Surprisingly this makes a function difference as referenced by the comment.


On Tue, Jul 29, 2014 at 4:28 PM, Peter Bourgon <notifications@github.com>
wrote:

> In harpoon-agent/logs_test.go:
>
> > +	if msg != expected {
> > +		t.Errorf("Received %q when expecting %q", msg, expected)
> > +	}
> > +}
> > +
> > +func ExpectNoMessage(t *testing.T, logSink chan string) {
> > +	select {
> > +	case msg := <-logSink:
> > +		t.Errorf("Received log line %q when we should have received nothing", msg)
> > +		// Don't block test suite, while conveniently forcing a context switch so that the
> > +		// results have time to propogate.
> > +	case <-time.After(time.Millisecond):
> > +		t.Errorf("Something blocked that should not have")
> > +	default:
> > +		// Happy path!
> > +	}
>
> If there is a default case, the <-time.After will never select.
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/soundcloud/harpoon/pull/13/files#r15525656>.
>