From 49a3fcae785eec1072c90397b30c67033eee2401 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 18 Nov 2021 09:57:20 -0800 Subject: [PATCH] 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 --- log/filelogger/log.go | 25 +++++++++++++++++++++++++ log/filelogger/log_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 log/filelogger/log_test.go 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) + } + } + +}