diff --git a/log/filelogger/log.go b/log/filelogger/log.go index 789284276..f8c4da65b 100644 --- a/log/filelogger/log.go +++ b/log/filelogger/log.go @@ -106,6 +106,7 @@ func (w *logFileWriter) appendToFileLocked(out []byte) { if w.fday != day { w.startNewFileLocked() } + out = removeDatePrefix(out) if w.f != nil { // RFC3339Nano but with a fixed number (3) of nanosecond digits: const formatPre = "2006-01-02T15:04:05" @@ -118,6 +119,30 @@ func (w *logFileWriter) appendToFileLocked(out []byte) { } } +func isNum(b byte) bool { return '0' <= b && b <= '9' } + +// removeDatePrefix returns a subslice of v with the log package's +// standard datetime prefix format removed, if present. +func removeDatePrefix(v []byte) []byte { + const format = "2009/01/23 01:23:23 " + if len(v) < len(format) { + return v + } + for i, b := range v[:len(format)] { + fb := format[i] + if isNum(fb) { + if !isNum(b) { + return v + } + continue + } + if b != fb { + return v + } + } + return v[len(format):] +} + // startNewFileLocked opens a new log file for writing // and also cleans up any old files. // diff --git a/log/filelogger/log_test.go b/log/filelogger/log_test.go new file mode 100644 index 000000000..74977292f --- /dev/null +++ b/log/filelogger/log_test.go @@ -0,0 +1,28 @@ +// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package filelogger + +import "testing" + +func TestRemoveDatePrefix(t *testing.T) { + tests := []struct { + in, want string + }{ + {"", ""}, + {"\n", "\n"}, + {"2009/01/23 01:23:23", "2009/01/23 01:23:23"}, + {"2009/01/23 01:23:23 \n", "\n"}, + {"2009/01/23 01:23:23 foo\n", "foo\n"}, + {"9999/01/23 01:23:23 foo\n", "foo\n"}, + {"2009_01/23 01:23:23 had an underscore\n", "2009_01/23 01:23:23 had an underscore\n"}, + } + for i, tt := range tests { + got := removeDatePrefix([]byte(tt.in)) + if string(got) != tt.want { + t.Logf("[%d] removeDatePrefix(%q) = %q; want %q", i, tt.in, got, tt.want) + } + } + +}