From 7ed74c1df690237d512c946c089375714dc2fa43 Mon Sep 17 00:00:00 2001 From: Steve Sanders Date: Fri, 4 Dec 2015 17:44:49 -0800 Subject: [PATCH 01/19] Bring back doFmtVerbLevelColor on Windows --- examples/example.go | 3 ++- log.go | 59 +++++++++++++++++++++++++++++++++++++++++++++ log_nix.go | 48 ------------------------------------ log_windows.go | 13 +++++----- 4 files changed, 67 insertions(+), 56 deletions(-) create mode 100644 log.go diff --git a/examples/example.go b/examples/example.go index 9f4ddee..1b5d1cc 100644 --- a/examples/example.go +++ b/examples/example.go @@ -27,7 +27,8 @@ func main() { // For demo purposes, create two backend for os.Stderr. backend1 := logging.NewLogBackend(os.Stderr, "", 0) backend2 := logging.NewLogBackend(os.Stderr, "", 0) - + backend1.Color = true + backend2.Color = true // For messages written to backend2 we want to add some additional // information to the output, including the used log level and the name of // the function. diff --git a/log.go b/log.go new file mode 100644 index 0000000..0d2a365 --- /dev/null +++ b/log.go @@ -0,0 +1,59 @@ +// Copyright 2013, Örjan Persson. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package logging + +import ( + "fmt" + "io" +) + +type color int + +const ( + colorBlack = iota + 30 + colorRed + colorGreen + colorYellow + colorBlue + colorMagenta + colorCyan + colorWhite +) + +var ( + colors = []string{ + CRITICAL: colorSeq(colorMagenta), + ERROR: colorSeq(colorRed), + WARNING: colorSeq(colorYellow), + NOTICE: colorSeq(colorGreen), + DEBUG: colorSeq(colorCyan), + } + boldcolors = []string{ + CRITICAL: colorSeqBold(colorMagenta), + ERROR: colorSeqBold(colorRed), + WARNING: colorSeqBold(colorYellow), + NOTICE: colorSeqBold(colorGreen), + DEBUG: colorSeqBold(colorCyan), + } +) + +func colorSeq(color color) string { + return fmt.Sprintf("\033[%dm", int(color)) +} + +func colorSeqBold(color color) string { + return fmt.Sprintf("\033[%d;1m", int(color)) +} + +func doFmtVerbLevelColor(layout string, level Level, output io.Writer) { + if layout == "bold" { + output.Write([]byte(boldcolors[level])) + } else if layout == "reset" { + output.Write([]byte("\033[0m")) + } else { + output.Write([]byte(colors[level])) + } +} + diff --git a/log_nix.go b/log_nix.go index f06a871..ffe2440 100644 --- a/log_nix.go +++ b/log_nix.go @@ -8,41 +8,10 @@ package logging import ( "bytes" - "fmt" "io" "log" ) -type color int - -const ( - colorBlack = iota + 30 - colorRed - colorGreen - colorYellow - colorBlue - colorMagenta - colorCyan - colorWhite -) - -var ( - colors = []string{ - CRITICAL: colorSeq(colorMagenta), - ERROR: colorSeq(colorRed), - WARNING: colorSeq(colorYellow), - NOTICE: colorSeq(colorGreen), - DEBUG: colorSeq(colorCyan), - } - boldcolors = []string{ - CRITICAL: colorSeqBold(colorMagenta), - ERROR: colorSeqBold(colorRed), - WARNING: colorSeqBold(colorYellow), - NOTICE: colorSeqBold(colorGreen), - DEBUG: colorSeqBold(colorCyan), - } -) - // LogBackend utilizes the standard log module. type LogBackend struct { Logger *log.Logger @@ -69,20 +38,3 @@ func (b *LogBackend) Log(level Level, calldepth int, rec *Record) error { return b.Logger.Output(calldepth+2, rec.Formatted(calldepth+1)) } -func colorSeq(color color) string { - return fmt.Sprintf("\033[%dm", int(color)) -} - -func colorSeqBold(color color) string { - return fmt.Sprintf("\033[%d;1m", int(color)) -} - -func doFmtVerbLevelColor(layout string, level Level, output io.Writer) { - if layout == "bold" { - output.Write([]byte(boldcolors[level])) - } else if layout == "reset" { - output.Write([]byte("\033[0m")) - } else { - output.Write([]byte(colors[level])) - } -} diff --git a/log_windows.go b/log_windows.go index b8dc92c..33e9fdf 100644 --- a/log_windows.go +++ b/log_windows.go @@ -17,6 +17,8 @@ var ( setConsoleTextAttributeProc = kernel32DLL.NewProc("SetConsoleTextAttribute") ) +type WORD uint16 + // Character attributes // Note: // -- The attributes are combined to produce various colors (e.g., Blue + Green will create Cyan). @@ -36,7 +38,7 @@ const ( ) var ( - colors = []uint16{ + win_colors = []uint16{ INFO: fgWhite, CRITICAL: fgMagenta, ERROR: fgRed, @@ -44,7 +46,7 @@ var ( NOTICE: fgGreen, DEBUG: fgCyan, } - boldcolors = []uint16{ + win_boldcolors = []uint16{ INFO: fgWhite | fgIntensity, CRITICAL: fgMagenta | fgIntensity, ERROR: fgRed | fgIntensity, @@ -84,7 +86,7 @@ func NewLogBackend(out io.Writer, prefix string, flag int) *LogBackend { func (b *LogBackend) Log(level Level, calldepth int, rec *Record) error { if b.Color && b.f != nil { buf := &bytes.Buffer{} - setConsoleTextAttribute(b.f, colors[level]) + setConsoleTextAttribute(b.f, win_colors[level]) buf.Write([]byte(rec.Formatted(calldepth + 1))) err := b.Logger.Output(calldepth+2, buf.String()) setConsoleTextAttribute(b.f, fgWhite) @@ -93,6 +95,7 @@ func (b *LogBackend) Log(level Level, calldepth int, rec *Record) error { return b.Logger.Output(calldepth+2, rec.Formatted(calldepth+1)) } + // setConsoleTextAttribute sets the attributes of characters written to the // console screen buffer by the WriteFile or WriteConsole function. // See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx. @@ -101,7 +104,3 @@ func setConsoleTextAttribute(f file, attribute uint16) bool { return ok != 0 } -func doFmtVerbLevelColor(layout string, level Level, output io.Writer) { - // TODO not supported on Windows since the io.Writer here is actually a - // bytes.Buffer. -} From 02b8acafc77c8a38a9b75a6722e9362b2b18eb06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=9F=E6=9E=97=E9=94=A6?= Date: Tue, 8 Dec 2015 00:56:38 +0800 Subject: [PATCH 02/19] Fix concurrent data race problem --- backend.go | 11 +++++++++++ level.go | 6 ++++++ logger.go | 2 ++ 3 files changed, 19 insertions(+) diff --git a/backend.go b/backend.go index 74d9201..a387392 100644 --- a/backend.go +++ b/backend.go @@ -4,8 +4,17 @@ package logging +import ( + "sync" +) + // defaultBackend is the backend used for all logging calls. var defaultBackend LeveledBackend +var defaultBackendMutex sync.Mutex + +func init() { + defaultBackendMutex = sync.Mutex{} +} // Backend is the interface which a log backend need to implement to be able to // be used as a logging backend. @@ -23,7 +32,9 @@ func SetBackend(backends ...Backend) LeveledBackend { backend = MultiLogger(backends...) } + defaultBackendMutex.Lock() defaultBackend = AddModuleLevel(backend) + defaultBackendMutex.Unlock() return defaultBackend } diff --git a/level.go b/level.go index 98dd191..ca2a918 100644 --- a/level.go +++ b/level.go @@ -70,6 +70,7 @@ type moduleLeveled struct { backend Backend formatter Formatter once sync.Once + mutex sync.Mutex } // AddModuleLevel wraps a log backend with knobs to have different log levels @@ -81,6 +82,7 @@ func AddModuleLevel(backend Backend) LeveledBackend { leveled = &moduleLeveled{ levels: make(map[string]Level), backend: backend, + mutex: sync.Mutex{}, } } return leveled @@ -88,6 +90,7 @@ func AddModuleLevel(backend Backend) LeveledBackend { // GetLevel returns the log level for the given module. func (l *moduleLeveled) GetLevel(module string) Level { + l.mutex.Lock() level, exists := l.levels[module] if exists == false { level, exists = l.levels[""] @@ -96,12 +99,15 @@ func (l *moduleLeveled) GetLevel(module string) Level { level = DEBUG } } + l.mutex.Unlock() return level } // SetLevel sets the log level for the given module. func (l *moduleLeveled) SetLevel(level Level, module string) { + l.mutex.Lock() l.levels[module] = level + l.mutex.Unlock() } // IsEnabledFor will return true if logging is enabled for the given module. diff --git a/logger.go b/logger.go index b430124..6bb301a 100644 --- a/logger.go +++ b/logger.go @@ -159,7 +159,9 @@ func (l *Logger) log(lvl Level, format string, args ...interface{}) { return } + defaultBackendMutex.Lock() defaultBackend.Log(lvl, 2+l.ExtraCalldepth, record) + defaultBackendMutex.Unlock() } // Fatal is equivalent to l.Critical(fmt.Sprint()) followed by a call to os.Exit(1). From d7b8c00ee8a21d4cfe58c75c0f09c6d3d030d80f Mon Sep 17 00:00:00 2001 From: Steve Sanders Date: Wed, 9 Dec 2015 11:25:47 -0800 Subject: [PATCH 03/19] go fmt --- log.go | 1 - log_nix.go | 1 - log_windows.go | 2 -- 3 files changed, 4 deletions(-) diff --git a/log.go b/log.go index 0d2a365..34351a8 100644 --- a/log.go +++ b/log.go @@ -56,4 +56,3 @@ func doFmtVerbLevelColor(layout string, level Level, output io.Writer) { output.Write([]byte(colors[level])) } } - diff --git a/log_nix.go b/log_nix.go index ffe2440..c114117 100644 --- a/log_nix.go +++ b/log_nix.go @@ -37,4 +37,3 @@ func (b *LogBackend) Log(level Level, calldepth int, rec *Record) error { return b.Logger.Output(calldepth+2, rec.Formatted(calldepth+1)) } - diff --git a/log_windows.go b/log_windows.go index 33e9fdf..72947d0 100644 --- a/log_windows.go +++ b/log_windows.go @@ -95,7 +95,6 @@ func (b *LogBackend) Log(level Level, calldepth int, rec *Record) error { return b.Logger.Output(calldepth+2, rec.Formatted(calldepth+1)) } - // setConsoleTextAttribute sets the attributes of characters written to the // console screen buffer by the WriteFile or WriteConsole function. // See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686047(v=vs.85).aspx. @@ -103,4 +102,3 @@ func setConsoleTextAttribute(f file, attribute uint16) bool { ok, _, _ := setConsoleTextAttributeProc.Call(f.Fd(), uintptr(attribute), 0) return ok != 0 } - From 75a0c5e878115bb091be8803ee7b3ed01a865aee Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Wed, 23 Mar 2016 15:18:57 -0700 Subject: [PATCH 04/19] Fixes missing Criticalf method Fixes this error when vendoring go/logger: github.com/keybase/client/go/logger/standard.go:208: log.internal.Criticalf undefined (type *logging.Logger has no field or method Criticalf) --- logger.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/logger.go b/logger.go index b430124..6558ca9 100644 --- a/logger.go +++ b/logger.go @@ -194,6 +194,11 @@ func (l *Logger) Critical(format string, args ...interface{}) { l.log(CRITICAL, format, args...) } +// Criticalf logs a message using CRITICAL as log level. +func (l *Logger) Criticalf(format string, args ...interface{}) { + l.log(CRITICAL, format, args...) +} + // Error logs a message using ERROR as log level. func (l *Logger) Error(format string, args ...interface{}) { l.log(ERROR, format, args...) From 33b700182d043033c7dcd066d028fb8b79a4924b Mon Sep 17 00:00:00 2001 From: Gabriel Handford Date: Wed, 23 Mar 2016 15:35:08 -0700 Subject: [PATCH 05/19] Revert "Fixes missing Criticalf method" --- logger.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/logger.go b/logger.go index 7ff5578..553ba4a 100644 --- a/logger.go +++ b/logger.go @@ -206,11 +206,6 @@ func (l *Logger) Criticalf(format string, args ...interface{}) { l.log(CRITICAL, &format, args...) } -// Criticalf logs a message using CRITICAL as log level. -func (l *Logger) Criticalf(format string, args ...interface{}) { - l.log(CRITICAL, format, args...) -} - // Error logs a message using ERROR as log level. func (l *Logger) Error(args ...interface{}) { l.log(ERROR, nil, args...) From 05fd69999ac9611351263ae8ededaa49453c4d90 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Wed, 22 Apr 2020 11:15:44 -0400 Subject: [PATCH 06/19] fix lint --- format.go | 12 +++--------- level.go | 4 ++-- log.go | 11 +++++------ logger.go | 8 ++++---- memory.go | 8 ++++---- 5 files changed, 18 insertions(+), 25 deletions(-) diff --git a/format.go b/format.go index 7160674..cbff258 100644 --- a/format.go +++ b/format.go @@ -274,9 +274,9 @@ func (f *stringFormatter) add(verb fmtVerb, layout string) { func (f *stringFormatter) Format(calldepth int, r *Record, output io.Writer) error { for _, part := range f.parts { if part.verb == fmtVerbStatic { - output.Write([]byte(part.layout)) + _, _ = output.Write([]byte(part.layout)) } else if part.verb == fmtVerbTime { - output.Write([]byte(r.Time.Format(part.layout))) + _, _ = output.Write([]byte(r.Time.Format(part.layout))) } else if part.verb == fmtVerbLevelColor { doFmtVerbLevelColor(part.layout, r.Level, output) } else if part.verb == fmtVerbCallpath { @@ -284,28 +284,22 @@ func (f *stringFormatter) Format(calldepth int, r *Record, output io.Writer) err if err != nil { depth = 0 } - output.Write([]byte(formatCallpath(calldepth+1, depth))) + _, _ = output.Write([]byte(formatCallpath(calldepth+1, depth))) } else { var v interface{} switch part.verb { case fmtVerbLevel: v = r.Level - break case fmtVerbID: v = r.ID - break case fmtVerbPid: v = pid - break case fmtVerbProgram: v = program - break case fmtVerbModule: v = r.Module - break case fmtVerbMessage: v = r.Message() - break case fmtVerbLongfile, fmtVerbShortfile: _, file, line, ok := runtime.Caller(calldepth + 1) if !ok { diff --git a/level.go b/level.go index ca2a918..be10533 100644 --- a/level.go +++ b/level.go @@ -92,10 +92,10 @@ func AddModuleLevel(backend Backend) LeveledBackend { func (l *moduleLeveled) GetLevel(module string) Level { l.mutex.Lock() level, exists := l.levels[module] - if exists == false { + if !exists { level, exists = l.levels[""] // no configuration exists, default to debug - if exists == false { + if !exists { level = DEBUG } } diff --git a/log.go b/log.go index 34351a8..1562ebc 100644 --- a/log.go +++ b/log.go @@ -12,14 +12,13 @@ import ( type color int const ( - colorBlack = iota + 30 + _ = iota + 30 colorRed colorGreen colorYellow - colorBlue + _ colorMagenta colorCyan - colorWhite ) var ( @@ -49,10 +48,10 @@ func colorSeqBold(color color) string { func doFmtVerbLevelColor(layout string, level Level, output io.Writer) { if layout == "bold" { - output.Write([]byte(boldcolors[level])) + _, _ = output.Write([]byte(boldcolors[level])) } else if layout == "reset" { - output.Write([]byte("\033[0m")) + _, _ = output.Write([]byte("\033[0m")) } else { - output.Write([]byte(colors[level])) + _, _ = output.Write([]byte(colors[level])) } } diff --git a/logger.go b/logger.go index 553ba4a..74f4d62 100644 --- a/logger.go +++ b/logger.go @@ -59,7 +59,7 @@ type Record struct { func (r *Record) Formatted(calldepth int) string { if r.formatted == "" { var buf bytes.Buffer - r.formatter.Format(calldepth+1, r, &buf) + _ = r.formatter.Format(calldepth+1, r, &buf) r.formatted = buf.String() } return r.formatted @@ -70,7 +70,7 @@ func (r *Record) Message() string { if r.message == nil { // Redact the arguments that implements the Redactor interface for i, arg := range r.Args { - if redactor, ok := arg.(Redactor); ok == true { + if redactor, ok := arg.(Redactor); ok { r.Args[i] = redactor.Redacted() } } @@ -163,12 +163,12 @@ func (l *Logger) log(lvl Level, format *string, args ...interface{}) { // ExtraCallDepth allows this to be extended further up the stack in case we // are wrapping these methods, eg. to expose them package level if l.haveBackend { - l.backend.Log(lvl, 2+l.ExtraCalldepth, record) + _ = l.backend.Log(lvl, 2+l.ExtraCalldepth, record) return } defaultBackendMutex.Lock() - defaultBackend.Log(lvl, 2+l.ExtraCalldepth, record) + _ = defaultBackend.Log(lvl, 2+l.ExtraCalldepth, record) defaultBackendMutex.Unlock() } diff --git a/memory.go b/memory.go index 8d5152c..b5ebafc 100644 --- a/memory.go +++ b/memory.go @@ -74,7 +74,7 @@ func (b *MemoryBackend) Log(level Level, calldepth int, rec *Record) error { tailp, np, ) - if swapped == true { + if swapped { if tailp == nil { b.head = np } else { @@ -100,7 +100,7 @@ func (b *MemoryBackend) Log(level Level, calldepth int, rec *Record) error { headp, unsafe.Pointer(head.next), ) - if swapped == true { + if swapped { atomic.AddInt32(&b.size, -1) break } @@ -160,7 +160,7 @@ func (b *ChannelMemoryBackend) Start() { defer b.mu.Unlock() // Launch the goroutine unless it's already running. - if b.running != true { + if !b.running { b.running = true b.stopWg.Add(1) go b.process() @@ -213,7 +213,7 @@ func (b *ChannelMemoryBackend) Flush() { // Stop signals the internal goroutine to exit and waits until it have. func (b *ChannelMemoryBackend) Stop() { b.mu.Lock() - if b.running == true { + if b.running { b.running = false b.events <- eventStop } From ce9d8969d32b87d8c22e7be62aece73707d76a50 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Wed, 22 Apr 2020 11:16:44 -0400 Subject: [PATCH 07/19] cleanup, rw mutex --- .travis.yml | 12 +++++++++--- backend.go | 8 ++------ level.go | 11 +++++------ logger.go | 4 ++-- memory.go | 10 +++++----- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/.travis.yml b/.travis.yml index 70e012b..317329c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,12 @@ language: go +script: + - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.23.6 + - golangci-lint run . + - go vet . + - go test . + go: - - 1.0 - - 1.1 - - tip + - 1.11.x + - 1.12.x + - 1.13.x diff --git a/backend.go b/backend.go index a387392..b10dbd8 100644 --- a/backend.go +++ b/backend.go @@ -10,11 +10,7 @@ import ( // defaultBackend is the backend used for all logging calls. var defaultBackend LeveledBackend -var defaultBackendMutex sync.Mutex - -func init() { - defaultBackendMutex = sync.Mutex{} -} +var defaultBackendMutex sync.RWMutex // Backend is the interface which a log backend need to implement to be able to // be used as a logging backend. @@ -33,8 +29,8 @@ func SetBackend(backends ...Backend) LeveledBackend { } defaultBackendMutex.Lock() + defer defaultBackendMutex.Unlock() defaultBackend = AddModuleLevel(backend) - defaultBackendMutex.Unlock() return defaultBackend } diff --git a/level.go b/level.go index be10533..14d6f29 100644 --- a/level.go +++ b/level.go @@ -66,11 +66,11 @@ type LeveledBackend interface { } type moduleLeveled struct { + sync.RWMutex levels map[string]Level backend Backend formatter Formatter once sync.Once - mutex sync.Mutex } // AddModuleLevel wraps a log backend with knobs to have different log levels @@ -82,7 +82,6 @@ func AddModuleLevel(backend Backend) LeveledBackend { leveled = &moduleLeveled{ levels: make(map[string]Level), backend: backend, - mutex: sync.Mutex{}, } } return leveled @@ -90,7 +89,8 @@ func AddModuleLevel(backend Backend) LeveledBackend { // GetLevel returns the log level for the given module. func (l *moduleLeveled) GetLevel(module string) Level { - l.mutex.Lock() + l.RLock() + defer l.RUnlock() level, exists := l.levels[module] if !exists { level, exists = l.levels[""] @@ -99,15 +99,14 @@ func (l *moduleLeveled) GetLevel(module string) Level { level = DEBUG } } - l.mutex.Unlock() return level } // SetLevel sets the log level for the given module. func (l *moduleLeveled) SetLevel(level Level, module string) { - l.mutex.Lock() + l.Lock() + defer l.Unlock() l.levels[module] = level - l.mutex.Unlock() } // IsEnabledFor will return true if logging is enabled for the given module. diff --git a/logger.go b/logger.go index 74f4d62..aca1b35 100644 --- a/logger.go +++ b/logger.go @@ -167,9 +167,9 @@ func (l *Logger) log(lvl Level, format *string, args ...interface{}) { return } - defaultBackendMutex.Lock() + defaultBackendMutex.RLock() + defer defaultBackendMutex.RUnlock() _ = defaultBackend.Log(lvl, 2+l.ExtraCalldepth, record) - defaultBackendMutex.Unlock() } // Fatal is equivalent to l.Critical(fmt.Sprint()) followed by a call to os.Exit(1). diff --git a/memory.go b/memory.go index b5ebafc..6d490aa 100644 --- a/memory.go +++ b/memory.go @@ -128,11 +128,11 @@ const ( // ChannelMemoryBackend is very similar to the MemoryBackend, except that it // internally utilizes a channel. type ChannelMemoryBackend struct { + sync.Mutex maxSize int size int incoming chan *Record events chan event - mu sync.Mutex running bool flushWg sync.WaitGroup stopWg sync.WaitGroup @@ -156,8 +156,8 @@ func NewChannelMemoryBackend(size int) *ChannelMemoryBackend { // Start launches the internal goroutine which starts processing data from the // input channel. func (b *ChannelMemoryBackend) Start() { - b.mu.Lock() - defer b.mu.Unlock() + b.Lock() + defer b.Unlock() // Launch the goroutine unless it's already running. if !b.running { @@ -212,12 +212,12 @@ func (b *ChannelMemoryBackend) Flush() { // Stop signals the internal goroutine to exit and waits until it have. func (b *ChannelMemoryBackend) Stop() { - b.mu.Lock() + b.Lock() + defer b.Unlock() if b.running { b.running = false b.events <- eventStop } - b.mu.Unlock() b.stopWg.Wait() } From 2c2af161a2eaece4b0ab464262d8010f3da26d27 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Wed, 22 Apr 2020 11:24:40 -0400 Subject: [PATCH 08/19] fix existing broken test --- log_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/log_test.go b/log_test.go index c7a645f..4ea07f4 100644 --- a/log_test.go +++ b/log_test.go @@ -60,7 +60,7 @@ func testCallpath(t *testing.T, format string, expect string) { } // Verify that the correct callpath is registered by go-logging if !strings.HasPrefix(parts[1], expect) { - t.Errorf("incorrect callpath: %s", parts[1]) + t.Errorf("incorrect callpath: %s missing prefix %s", parts[1], expect) } // Verify that the correct message is registered by go-logging if !strings.HasPrefix(parts[2], "test callpath") { @@ -69,12 +69,12 @@ func testCallpath(t *testing.T, format string, expect string) { } func TestLogCallpath(t *testing.T) { - testCallpath(t, "%{callpath} %{message}", "TestLogCallpath.testCallpath.rec...rec.a.b.c") - testCallpath(t, "%{callpath:-1} %{message}", "TestLogCallpath.testCallpath.rec...rec.a.b.c") - testCallpath(t, "%{callpath:0} %{message}", "TestLogCallpath.testCallpath.rec...rec.a.b.c") + testCallpath(t, "%{callpath} %{message}", "TestLogCallpath.String.rec...a.b.c") + testCallpath(t, "%{callpath:-1} %{message}", "TestLogCallpath.String.rec...a.b.c") + testCallpath(t, "%{callpath:0} %{message}", "TestLogCallpath.String.rec...a.b.c") testCallpath(t, "%{callpath:1} %{message}", "~.c") - testCallpath(t, "%{callpath:2} %{message}", "~.b.c") - testCallpath(t, "%{callpath:3} %{message}", "~.a.b.c") + testCallpath(t, "%{callpath:2} %{message}", "~.c.c") + testCallpath(t, "%{callpath:3} %{message}", "~.b.c.c") } func BenchmarkLogMemoryBackendIgnored(b *testing.B) { From ae4bccafc94cc37a4b2b1f03e66acb1f082b536a Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Wed, 22 Apr 2020 11:45:10 -0400 Subject: [PATCH 09/19] trigger ci From 09554349da10d237a679f503e7e3a4be8f5339de Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Wed, 22 Apr 2020 11:51:53 -0400 Subject: [PATCH 10/19] drop go 1.11/1.12 --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 317329c..2207143 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,5 @@ script: - go test . go: - - 1.11.x - - 1.12.x - 1.13.x + - 1.14.x From 58d00cf328496d9f4430f76b9de742416380eabc Mon Sep 17 00:00:00 2001 From: Marcel O'Neil Date: Wed, 29 Apr 2020 12:12:34 -0400 Subject: [PATCH 11/19] move to go modules --- examples/example.go | 2 +- format_test.go | 8 ++++---- go.mod | 3 +++ go.sum | 0 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 go.mod create mode 100644 go.sum diff --git a/examples/example.go b/examples/example.go index 1b5d1cc..030e332 100644 --- a/examples/example.go +++ b/examples/example.go @@ -3,7 +3,7 @@ package main import ( "os" - "github.com/op/go-logging" + "github.com/keybase/go-logging" ) var log = logging.MustGetLogger("example") diff --git a/format_test.go b/format_test.go index c008e9e..575067c 100644 --- a/format_test.go +++ b/format_test.go @@ -109,13 +109,13 @@ func TestFormatFuncName(t *testing.T) { "main", "main", "main"}, - {"github.com/op/go-logging.func·001", - "github.com/op/go-logging", + {"github.com/keybase/go-logging.func·001", + "github.com/keybase/go-logging", "go-logging", "func·001", "func·001"}, - {"github.com/op/go-logging.stringFormatter.Format", - "github.com/op/go-logging", + {"github.com/keybase/go-logging.stringFormatter.Format", + "github.com/keybase/go-logging", "go-logging", "stringFormatter.Format", "Format"}, diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1df084b --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/keybase/go-logging + +go 1.13 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e69de29 From 854d991fb3d0ccd4fd99992bd2556d7e3b1d6f91 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Tue, 9 Nov 2021 14:54:54 -0500 Subject: [PATCH 12/19] test against supported go versions --- .travis.yml | 7 ++++--- go.mod | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2207143..f0b5874 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,12 @@ language: go script: - - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.23.6 + - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.43.0 - golangci-lint run . - go vet . - go test . go: - - 1.13.x - - 1.14.x + - 1.15.x + - 1.16.x + - 1.17.x diff --git a/go.mod b/go.mod index 1df084b..f9d645b 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/keybase/go-logging -go 1.13 +go 1.17 From 91d0bb18cd4cd31ac0c3f3e903c396d778bc7e7c Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Thu, 18 Nov 2021 11:29:11 -0500 Subject: [PATCH 13/19] kick ci From aa4058b1c9cdb252eb1096c6041fe38d8095ea93 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Fri, 7 Oct 2022 15:26:52 -0400 Subject: [PATCH 14/19] test against the latest versions of go --- .travis.yml | 6 +++--- go.mod | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index f0b5874..9c3a324 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,12 @@ language: go script: - - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.43.0 + - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.50.0 - golangci-lint run . - go vet . - go test . go: - - 1.15.x - - 1.16.x - 1.17.x + - 1.18.x + - 1.19.x diff --git a/go.mod b/go.mod index f9d645b..973e522 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/keybase/go-logging -go 1.17 +go 1.19 From c617c0c487414e06583f00df66162bfa722697f1 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Fri, 7 Oct 2022 15:38:17 -0400 Subject: [PATCH 15/19] go fmt ./... --- format.go | 34 ++++++++++++++++++---------------- log_nix.go | 2 +- log_windows.go | 6 +++++- memory.go | 1 + syslog.go | 3 ++- syslog_fallback.go | 3 ++- 6 files changed, 29 insertions(+), 20 deletions(-) diff --git a/format.go b/format.go index cbff258..93169dd 100644 --- a/format.go +++ b/format.go @@ -154,17 +154,18 @@ type stringFormatter struct { // The verbs: // // General: -// %{id} Sequence number for log message (uint64). -// %{pid} Process id (int) -// %{time} Time when log occurred (time.Time) -// %{level} Log level (Level) -// %{module} Module (string) -// %{program} Basename of os.Args[0] (string) -// %{message} Message (string) -// %{longfile} Full file name and line number: /a/b/c/d.go:23 -// %{shortfile} Final file name element and line number: d.go:23 -// %{callpath} Callpath like main.a.b.c...c "..." meaning recursive call ~. meaning truncated path -// %{color} ANSI color based on log level +// +// %{id} Sequence number for log message (uint64). +// %{pid} Process id (int) +// %{time} Time when log occurred (time.Time) +// %{level} Log level (Level) +// %{module} Module (string) +// %{program} Basename of os.Args[0] (string) +// %{message} Message (string) +// %{longfile} Full file name and line number: /a/b/c/d.go:23 +// %{shortfile} Final file name element and line number: d.go:23 +// %{callpath} Callpath like main.a.b.c...c "..." meaning recursive call ~. meaning truncated path +// %{color} ANSI color based on log level // // For normal types, the output can be customized by using the 'verbs' defined // in the fmt package, eg. '%{id:04d}' to make the id output be '%04d' as the @@ -191,11 +192,12 @@ type stringFormatter struct { // future. // // Experimental: -// %{longpkg} Full package path, eg. github.com/go-logging -// %{shortpkg} Base package path, eg. go-logging -// %{longfunc} Full function name, eg. littleEndian.PutUint32 -// %{shortfunc} Base function name, eg. PutUint32 -// %{callpath} Call function path, eg. main.a.b.c +// +// %{longpkg} Full package path, eg. github.com/go-logging +// %{shortpkg} Base package path, eg. go-logging +// %{longfunc} Full function name, eg. littleEndian.PutUint32 +// %{shortfunc} Base function name, eg. PutUint32 +// %{callpath} Call function path, eg. main.a.b.c func NewStringFormatter(format string) (Formatter, error) { var fmter = &stringFormatter{} diff --git a/log_nix.go b/log_nix.go index 435574d..e84b7c3 100644 --- a/log_nix.go +++ b/log_nix.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows // Copyright 2013, Örjan Persson. All rights reserved. @@ -43,4 +44,3 @@ func (b *LogBackend) Log(level Level, calldepth int, rec *Record) error { return b.Logger.Output(calldepth+2, rec.Formatted(calldepth+1)) } - diff --git a/log_windows.go b/log_windows.go index 72947d0..c651cf7 100644 --- a/log_windows.go +++ b/log_windows.go @@ -1,4 +1,6 @@ +//go:build windows // +build windows + // Copyright 2013, Örjan Persson. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -22,7 +24,9 @@ type WORD uint16 // Character attributes // Note: // -- The attributes are combined to produce various colors (e.g., Blue + Green will create Cyan). -// Clearing all foreground or background colors results in black; setting all creates white. +// +// Clearing all foreground or background colors results in black; setting all creates white. +// // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes. const ( fgBlack = 0x0000 diff --git a/memory.go b/memory.go index 6d490aa..4af44fd 100644 --- a/memory.go +++ b/memory.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !appengine // +build !appengine package logging diff --git a/syslog.go b/syslog.go index 4faa531..40fae75 100644 --- a/syslog.go +++ b/syslog.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//+build !windows,!plan9 +//go:build !windows && !plan9 +// +build !windows,!plan9 package logging diff --git a/syslog_fallback.go b/syslog_fallback.go index 91bc18d..05bb1e2 100644 --- a/syslog_fallback.go +++ b/syslog_fallback.go @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//+build windows plan9 +//go:build windows || plan9 +// +build windows plan9 package logging From 3c57f4b1caa740b34ad03f1ef1eb02eb9e639424 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Fri, 7 Oct 2022 16:01:12 -0400 Subject: [PATCH 16/19] no ioutil --- log_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/log_test.go b/log_test.go index 4ea07f4..f98f96b 100644 --- a/log_test.go +++ b/log_test.go @@ -6,7 +6,7 @@ package logging import ( "bytes" - "io/ioutil" + "io" "log" "strings" "testing" @@ -98,20 +98,20 @@ func BenchmarkLogChannelMemoryBackend(b *testing.B) { } func BenchmarkLogLeveled(b *testing.B) { - backend := SetBackend(NewLogBackend(ioutil.Discard, "", 0)) + backend := SetBackend(NewLogBackend(io.Discard, "", 0)) backend.SetLevel(INFO, "") RunLogBenchmark(b) } func BenchmarkLogLogBackend(b *testing.B) { - backend := SetBackend(NewLogBackend(ioutil.Discard, "", 0)) + backend := SetBackend(NewLogBackend(io.Discard, "", 0)) backend.SetLevel(DEBUG, "") RunLogBenchmark(b) } func BenchmarkLogLogBackendColor(b *testing.B) { - colorizer := NewLogBackend(ioutil.Discard, "", 0) + colorizer := NewLogBackend(io.Discard, "", 0) colorizer.Color = true backend := SetBackend(colorizer) backend.SetLevel(DEBUG, "") @@ -119,13 +119,13 @@ func BenchmarkLogLogBackendColor(b *testing.B) { } func BenchmarkLogLogBackendStdFlags(b *testing.B) { - backend := SetBackend(NewLogBackend(ioutil.Discard, "", log.LstdFlags)) + backend := SetBackend(NewLogBackend(io.Discard, "", log.LstdFlags)) backend.SetLevel(DEBUG, "") RunLogBenchmark(b) } func BenchmarkLogLogBackendLongFileFlag(b *testing.B) { - backend := SetBackend(NewLogBackend(ioutil.Discard, "", log.Llongfile)) + backend := SetBackend(NewLogBackend(io.Discard, "", log.Llongfile)) backend.SetLevel(DEBUG, "") RunLogBenchmark(b) } @@ -141,14 +141,14 @@ func RunLogBenchmark(b *testing.B) { } func BenchmarkLogFixed(b *testing.B) { - backend := SetBackend(NewLogBackend(ioutil.Discard, "", 0)) + backend := SetBackend(NewLogBackend(io.Discard, "", 0)) backend.SetLevel(DEBUG, "") RunLogBenchmarkFixedString(b) } func BenchmarkLogFixedIgnored(b *testing.B) { - backend := SetBackend(NewLogBackend(ioutil.Discard, "", 0)) + backend := SetBackend(NewLogBackend(io.Discard, "", 0)) backend.SetLevel(INFO, "") RunLogBenchmarkFixedString(b) } From 684745a9cd3b97d92a5c546c295f50c4b1d3b688 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Tue, 20 Dec 2022 17:46:58 -0500 Subject: [PATCH 17/19] migrate to github actions --- .github/workflows/ci.yml | 26 ++++++++++++++++++++++++++ .travis.yml | 12 ------------ README.md | 9 +++++---- 3 files changed, 31 insertions(+), 16 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..fc60d79 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,26 @@ +name: CI +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + test: + strategy: + matrix: + go-version: [1.17.x, 1.18.x, 1.19.x] + os: [ubuntu-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/setup-go@v3 + with: + go-version: ${{ matrix.go-version }} + - uses: actions/checkout@v3 + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.50 + - run: go vet ./... + - run: go test ./... diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9c3a324..0000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -script: - - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.50.0 - - golangci-lint run . - - go vet . - - go test . - -go: - - 1.17.x - - 1.18.x - - 1.19.x diff --git a/README.md b/README.md index aba9398..98e4289 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ ## Golang logging library -[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/op/go-logging) [![build](https://img.shields.io/travis/op/go-logging.svg?style=flat)](https://travis-ci.org/op/go-logging) +[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/op/go-logging) +[![Build Status](https://github.com/keybase/go-logging/actions/workflows/ci.yml/badge.svg)](https://github.com/keybase/go-logging/actions) Package logging implements a logging infrastructure for Go. Its output format is customizable and supports different logging backends like syslog, file and @@ -72,11 +73,11 @@ func main() { ## Installing -### Using *go get* +### Using _go get_ $ go get github.com/op/go-logging -After this command *go-logging* is ready to use. Its source will be in: +After this command _go-logging_ is ready to use. Its source will be in: $GOPATH/src/pkg/github.com/op/go-logging @@ -90,4 +91,4 @@ For docs, see http://godoc.org/github.com/op/go-logging or run: ## Additional resources -* [wslog](https://godoc.org/github.com/cryptix/go/logging/wslog) -- exposes log messages through a WebSocket. +- [wslog](https://godoc.org/github.com/cryptix/go/logging/wslog) -- exposes log messages through a WebSocket. From 6019b28399759837cfbb217093854e1d8f31dbab Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Wed, 13 Dec 2023 15:45:54 -0500 Subject: [PATCH 18/19] Test against the latest versions of Go --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc60d79..2440c23 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: test: strategy: matrix: - go-version: [1.17.x, 1.18.x, 1.19.x] + go-version: [1.19.x, 1.20.x, 1.21.x] os: [ubuntu-latest] runs-on: ${{ matrix.os }} steps: @@ -21,6 +21,6 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: - version: v1.50 + version: v1.55 - run: go vet ./... - run: go test ./... From c0ab00508229da66acc387e125ad276b09571a2a Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Mon, 6 Jan 2025 14:07:17 -0500 Subject: [PATCH 19/19] Upgrade to go 1.23 --- .github/workflows/ci.yml | 4 ++-- go.mod | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2440c23..ff49c47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: test: strategy: matrix: - go-version: [1.19.x, 1.20.x, 1.21.x] + go-version: [1.21.x, 1.22.x, 1.23.x] os: [ubuntu-latest] runs-on: ${{ matrix.os }} steps: @@ -21,6 +21,6 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: - version: v1.55 + version: v1.63 - run: go vet ./... - run: go test ./... diff --git a/go.mod b/go.mod index 973e522..491caf1 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/keybase/go-logging -go 1.19 +go 1.21