log/filelogger: make filelogger remove redundant date before adding a date

At some point since filelogger was added on Windows, the log hierarchy
above it changed such that a log.Printf writes to filelogger and includes
the log package's own date. But then filelogger adds another.

Rather than debug everything above and risk removing the prefix when
run by tailscaled, instead just remove the log package's prefix
very late right before we go to add the filelogger's own.

Change-Id: I9db518f42c603ef83017f74827270f124fdf5c14
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2021-11-18 09:57:20 -08:00 committed by Brad Fitzpatrick
parent 4a59a2781a
commit 49a3fcae78
2 changed files with 53 additions and 0 deletions

View File

@ -106,6 +106,7 @@ func (w *logFileWriter) appendToFileLocked(out []byte) {
if w.fday != day { if w.fday != day {
w.startNewFileLocked() w.startNewFileLocked()
} }
out = removeDatePrefix(out)
if w.f != nil { if w.f != nil {
// RFC3339Nano but with a fixed number (3) of nanosecond digits: // RFC3339Nano but with a fixed number (3) of nanosecond digits:
const formatPre = "2006-01-02T15:04:05" 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 // startNewFileLocked opens a new log file for writing
// and also cleans up any old files. // and also cleans up any old files.
// //

View File

@ -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)
}
}
}