Skip to content

Commit 4ea8790

Browse files
Merge pull request #346 from jgreat/strip-log-headers
Strip header bytes from log stream
2 parents 35bd40c + bdcf4c3 commit 4ea8790

File tree

4 files changed

+67
-18
lines changed

4 files changed

+67
-18
lines changed

glide.lock

Lines changed: 8 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

glide.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package: github.com/gliderlabs/logspout
2+
excludeDirs:
3+
- custom
24
import:
35
- package: github.com/fsouza/go-dockerclient
46
- package: github.com/gorilla/mux
57
- package: golang.org/x/net
68
subpackages:
79
- websocket
10+
- package: github.com/hashicorp/go-version

router/pump.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"time"
1212

1313
"github.com/fsouza/go-dockerclient"
14+
"github.com/hashicorp/go-version"
1415
)
1516

1617
var allowTTY bool
@@ -180,6 +181,10 @@ func (p *LogsPump) Run() error {
180181

181182
func (p *LogsPump) pumpLogs(event *docker.APIEvents, backlog bool, inactivityTimeout time.Duration) {
182183
id := normalID(event.ID)
184+
185+
dockerVersion, err := p.client.Version()
186+
assert(err, "Could not get Docker Version endpoint")
187+
183188
container, err := p.client.InspectContainer(id)
184189
assert(err, "pump")
185190
if ignoreContainerTTY(container) {
@@ -211,7 +216,7 @@ func (p *LogsPump) pumpLogs(event *docker.APIEvents, backlog bool, inactivityTim
211216
}
212217
outrd, outwr := io.Pipe()
213218
errrd, errwr := io.Pipe()
214-
p.pumps[id] = newContainerPump(container, outrd, errrd)
219+
p.pumps[id] = newContainerPump(container, dockerVersion, outrd, errrd)
215220
p.mu.Unlock()
216221
p.update(event)
217222
go func() {
@@ -339,14 +344,32 @@ type containerPump struct {
339344
logstreams map[chan *Message]*Route
340345
}
341346

342-
func newContainerPump(container *docker.Container, stdout, stderr io.Reader) *containerPump {
347+
func newContainerPump(container *docker.Container, dockerVersion *docker.Env, stdout, stderr io.Reader) *containerPump {
348+
apiVersion := dockerVersion.Get("ApiVersion")
349+
debug("API Version: ", apiVersion)
350+
debug("TTY is: ", container.Config.Tty)
351+
earliestAPI, _ := version.NewVersion("1.13")
352+
currentAPI, err := version.NewVersion(apiVersion)
353+
assert(err, "current docker api version is not valid version string")
354+
hasHeaders := false
355+
if container.Config.Tty == false {
356+
if currentAPI.Compare(earliestAPI) >= 0 {
357+
hasHeaders = true
358+
}
359+
}
360+
debug("hasHeaders set to: ", hasHeaders)
361+
343362
cp := &containerPump{
344363
container: container,
345364
logstreams: make(map[chan *Message]*Route),
346365
}
347-
pump := func(source string, input io.Reader) {
366+
pump := func(source string, hasHeaders bool, input io.Reader) {
348367
buf := bufio.NewReader(input)
349368
for {
369+
// Discard header bytes from log message if TTY is false and api > 1.13.
370+
if hasHeaders {
371+
buf.Discard(8)
372+
}
350373
line, err := buf.ReadString('\n')
351374
if err != nil {
352375
if err != io.EOF {
@@ -362,8 +385,8 @@ func newContainerPump(container *docker.Container, stdout, stderr io.Reader) *co
362385
})
363386
}
364387
}
365-
go pump("stdout", stdout)
366-
go pump("stderr", stderr)
388+
go pump("stdout", hasHeaders, stdout)
389+
go pump("stderr", hasHeaders, stderr)
367390
return cp
368391
}
369392

router/pump_test.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,18 @@ func TestPumpContainerRename(t *testing.T) {
127127
pumps: make(map[string]*containerPump),
128128
routes: make(map[chan *update]struct{}),
129129
}
130+
config := &docker.Config{
131+
Tty: false,
132+
}
130133
container = &docker.Container{
131-
ID: "8dfafdbc3a40",
132-
Name: "foo",
134+
ID: "8dfafdbc3a40",
135+
Name: "foo",
136+
Config: config,
137+
}
138+
version := &docker.Env{
139+
"ApiVersion=1.33",
133140
}
134-
p.pumps["8dfafdbc3a40"] = newContainerPump(container, os.Stdout, os.Stderr)
141+
p.pumps["8dfafdbc3a40"] = newContainerPump(container, version, os.Stdout, os.Stderr)
135142
if name := p.pumps["8dfafdbc3a40"].container.Name; name != "foo" {
136143
t.Errorf("containerPump should have name: 'foo' got name: '%s'", name)
137144
}
@@ -142,21 +149,35 @@ func TestPumpContainerRename(t *testing.T) {
142149
}
143150

144151
func TestPumpNewContainerPump(t *testing.T) {
152+
config := &docker.Config{
153+
Tty: false,
154+
}
145155
container := &docker.Container{
146-
ID: "8dfafdbc3a40",
156+
ID: "8dfafdbc3a40",
157+
Config: config,
147158
}
148-
pump := newContainerPump(container, os.Stdout, os.Stderr)
159+
version := &docker.Env{
160+
"ApiVersion=1.33",
161+
}
162+
pump := newContainerPump(container, version, os.Stdout, os.Stderr)
149163
if pump == nil {
150164
t.Error("pump nil")
151165
return
152166
}
153167
}
154168

155169
func TestPumpContainerPump(t *testing.T) {
170+
config := &docker.Config{
171+
Tty: true,
172+
}
156173
container := &docker.Container{
157-
ID: "8dfafdbc3a40",
174+
ID: "8dfafdbc3a40",
175+
Config: config,
176+
}
177+
version := &docker.Env{
178+
"ApiVersion=1.33",
158179
}
159-
pump := newContainerPump(container, os.Stdout, os.Stderr)
180+
pump := newContainerPump(container, version, os.Stdout, os.Stderr)
160181
logstream, route := make(chan *Message), &Route{}
161182
go func() {
162183
for msg := range logstream {

0 commit comments

Comments
 (0)