diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-10-21 11:17:48 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-10-22 09:09:29 +0200 |
commit | fdfa4a5fe62232f65f1dd8d6fe0c500374228788 (patch) | |
tree | b804e91506a7f3c58690c6fd774b28f95184d5dc /common/loggers | |
parent | 8cbe2bbfad6aa4de267921e24e166d4addf47040 (diff) |
Allow getJSON errors to be ignored
This change is mostly motivated to get a more stable CI build (we're building the Hugo site there, with Instagram and Twitter shortcodes sometimes failing).
Fixes #7866
Diffstat (limited to 'common/loggers')
-rw-r--r-- | common/loggers/ignorableLogger.go | 20 | ||||
-rw-r--r-- | common/loggers/loggers.go | 139 | ||||
-rw-r--r-- | common/loggers/loggers_test.go | 8 |
3 files changed, 129 insertions, 38 deletions
diff --git a/common/loggers/ignorableLogger.go b/common/loggers/ignorableLogger.go index e12e41d68..1bd4d99b8 100644 --- a/common/loggers/ignorableLogger.go +++ b/common/loggers/ignorableLogger.go @@ -19,25 +19,31 @@ import ( ) // IgnorableLogger is a logger that ignores certain log statements. -type IgnorableLogger struct { - logger *Logger +type IgnorableLogger interface { + Logger + Errorsf(statementID, format string, v ...interface{}) +} + +type ignorableLogger struct { + Logger statements map[string]bool } // NewIgnorableLogger wraps the given logger and ignores the log statement IDs given. -func NewIgnorableLogger(logger *Logger, statements ...string) IgnorableLogger { +func NewIgnorableLogger(logger Logger, statements ...string) IgnorableLogger { statementsSet := make(map[string]bool) for _, s := range statements { statementsSet[strings.ToLower(s)] = true } - return IgnorableLogger{ - logger: logger, + return ignorableLogger{ + Logger: logger, statements: statementsSet, } } -func (l IgnorableLogger) Errorf(statementID, format string, v ...interface{}) { +// Errorsf logs statementID as an ERROR if not configured as ignoreable. +func (l ignorableLogger) Errorsf(statementID, format string, v ...interface{}) { if l.statements[statementID] { // Ignore. return @@ -48,5 +54,5 @@ ignoreErrors = [%q]`, statementID) format += ignoreMsg - l.logger.ERROR.Printf(format, v...) + l.Errorf(format, v...) } diff --git a/common/loggers/loggers.go b/common/loggers/loggers.go index d406e5f20..5c04b9eab 100644 --- a/common/loggers/loggers.go +++ b/common/loggers/loggers.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Hugo Authors. All rights reserved. +// Copyright 2020 The Hugo Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -56,39 +56,122 @@ func (w prefixWriter) Write(p []byte) (n int, err error) { return len(p), nil } -// Logger wraps a *loggers.Logger and some other related logging state. -type Logger struct { +type Logger interface { + Printf(format string, v ...interface{}) + Println(v ...interface{}) + PrintTimerIfDelayed(start time.Time, name string) + Debug() *log.Logger + Info() *log.Logger + Infof(format string, v ...interface{}) + Infoln(v ...interface{}) + Warn() *log.Logger + Warnf(format string, v ...interface{}) + Warnln(v ...interface{}) + Error() *log.Logger + Errorf(format string, v ...interface{}) + Errorln(v ...interface{}) + Errors() string + + Out() io.Writer + + Reset() + + // Used in tests. + LogCounters() *LogCounters +} + +type LogCounters struct { + ErrorCounter *jww.Counter + WarnCounter *jww.Counter +} + +type logger struct { *jww.Notepad // The writer that represents stdout. // Will be ioutil.Discard when in quiet mode. - Out io.Writer + out io.Writer - ErrorCounter *jww.Counter - WarnCounter *jww.Counter + logCounters *LogCounters // This is only set in server mode. errors *bytes.Buffer } +func (l *logger) Printf(format string, v ...interface{}) { + l.FEEDBACK.Printf(format, v...) +} + +func (l *logger) Println(v ...interface{}) { + l.FEEDBACK.Println(v...) +} + +func (l *logger) Debug() *log.Logger { + return l.DEBUG +} + +func (l *logger) Infof(format string, v ...interface{}) { + l.INFO.Printf(format, v...) +} + +func (l *logger) Infoln(v ...interface{}) { + l.INFO.Println(v...) +} + +func (l *logger) Info() *log.Logger { + return l.INFO +} + +func (l *logger) Warnf(format string, v ...interface{}) { + l.WARN.Printf(format, v...) +} + +func (l *logger) Warnln(v ...interface{}) { + l.WARN.Println(v...) +} + +func (l *logger) Warn() *log.Logger { + return l.WARN +} + +func (l *logger) Errorf(format string, v ...interface{}) { + l.ERROR.Printf(format, v...) +} + +func (l *logger) Errorln(v ...interface{}) { + l.ERROR.Println(v...) +} + +func (l *logger) Error() *log.Logger { + return l.ERROR +} + +func (l *logger) LogCounters() *LogCounters { + return l.logCounters +} + +func (l *logger) Out() io.Writer { + return l.out +} + // PrintTimerIfDelayed prints a time statement to the FEEDBACK logger // if considerable time is spent. -func (l *Logger) PrintTimerIfDelayed(start time.Time, name string) { +func (l *logger) PrintTimerIfDelayed(start time.Time, name string) { elapsed := time.Since(start) milli := int(1000 * elapsed.Seconds()) if milli < 500 { return } - l.FEEDBACK.Printf("%s in %v ms", name, milli) + l.Printf("%s in %v ms", name, milli) } -func (l *Logger) PrintTimer(start time.Time, name string) { +func (l *logger) PrintTimer(start time.Time, name string) { elapsed := time.Since(start) milli := int(1000 * elapsed.Seconds()) - l.FEEDBACK.Printf("%s in %v ms", name, milli) + l.Printf("%s in %v ms", name, milli) } -func (l *Logger) Errors() string { +func (l *logger) Errors() string { if l.errors == nil { return "" } @@ -96,45 +179,45 @@ func (l *Logger) Errors() string { } // Reset resets the logger's internal state. -func (l *Logger) Reset() { - l.ErrorCounter.Reset() +func (l *logger) Reset() { + l.logCounters.ErrorCounter.Reset() if l.errors != nil { l.errors.Reset() } } // NewLogger creates a new Logger for the given thresholds -func NewLogger(stdoutThreshold, logThreshold jww.Threshold, outHandle, logHandle io.Writer, saveErrors bool) *Logger { +func NewLogger(stdoutThreshold, logThreshold jww.Threshold, outHandle, logHandle io.Writer, saveErrors bool) Logger { return newLogger(stdoutThreshold, logThreshold, outHandle, logHandle, saveErrors) } // NewDebugLogger is a convenience function to create a debug logger. -func NewDebugLogger() *Logger { +func NewDebugLogger() Logger { return NewBasicLogger(jww.LevelDebug) } // NewWarningLogger is a convenience function to create a warning logger. -func NewWarningLogger() *Logger { +func NewWarningLogger() Logger { return NewBasicLogger(jww.LevelWarn) } // NewInfoLogger is a convenience function to create a info logger. -func NewInfoLogger() *Logger { +func NewInfoLogger() Logger { return NewBasicLogger(jww.LevelInfo) } // NewErrorLogger is a convenience function to create an error logger. -func NewErrorLogger() *Logger { +func NewErrorLogger() Logger { return NewBasicLogger(jww.LevelError) } // NewBasicLogger creates a new basic logger writing to Stdout. -func NewBasicLogger(t jww.Threshold) *Logger { +func NewBasicLogger(t jww.Threshold) Logger { return newLogger(t, jww.LevelError, os.Stdout, ioutil.Discard, false) } // NewBasicLoggerForWriter creates a new basic logger writing to w. -func NewBasicLoggerForWriter(t jww.Threshold, w io.Writer) *Logger { +func NewBasicLoggerForWriter(t jww.Threshold, w io.Writer) Logger { return newLogger(t, jww.LevelError, w, ioutil.Discard, false) } @@ -219,7 +302,7 @@ var fatalLogListener = func(t jww.Threshold) io.Writer { return new(fatalLogWriter) } -func newLogger(stdoutThreshold, logThreshold jww.Threshold, outHandle, logHandle io.Writer, saveErrors bool) *Logger { +func newLogger(stdoutThreshold, logThreshold jww.Threshold, outHandle, logHandle io.Writer, saveErrors bool) *logger { errorCounter := &jww.Counter{} warnCounter := &jww.Counter{} outHandle, logHandle = getLogWriters(outHandle, logHandle) @@ -239,11 +322,13 @@ func newLogger(stdoutThreshold, logThreshold jww.Threshold, outHandle, logHandle listeners = append(listeners, errorCapture) } - return &Logger{ - Notepad: jww.NewNotepad(stdoutThreshold, logThreshold, outHandle, logHandle, "", log.Ldate|log.Ltime, listeners...), - Out: outHandle, - ErrorCounter: errorCounter, - WarnCounter: warnCounter, - errors: errorBuff, + return &logger{ + Notepad: jww.NewNotepad(stdoutThreshold, logThreshold, outHandle, logHandle, "", log.Ldate|log.Ltime, listeners...), + out: outHandle, + logCounters: &LogCounters{ + ErrorCounter: errorCounter, + WarnCounter: warnCounter, + }, + errors: errorBuff, } } diff --git a/common/loggers/loggers_test.go b/common/loggers/loggers_test.go index bf52d97c1..7af3ca9da 100644 --- a/common/loggers/loggers_test.go +++ b/common/loggers/loggers_test.go @@ -26,11 +26,11 @@ func TestLogger(t *testing.T) { c := qt.New(t) l := NewWarningLogger() - l.ERROR.Println("One error") - l.ERROR.Println("Two error") - l.WARN.Println("A warning") + l.Errorln("One error") + l.Errorln("Two error") + l.Warnln("A warning") - c.Assert(l.ErrorCounter.Count(), qt.Equals, uint64(2)) + c.Assert(l.LogCounters().ErrorCounter.Count(), qt.Equals, uint64(2)) } |