Skip to content

Commit

Permalink
fix and deduplicate logger sync error handling (smartcontractkit#5244)
Browse files Browse the repository at this point in the history
  • Loading branch information
jmank88 authored Oct 18, 2021
1 parent 2e7890f commit 2ae2215
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 13 deletions.
9 changes: 2 additions & 7 deletions core/logger/default.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package logger

import (
"errors"
"fmt"
"log"
"os"
Expand Down Expand Up @@ -43,12 +42,8 @@ func InitLogger(newLogger Logger) {
if Default != nil {
defer func(l Logger) {
if err := l.Sync(); err != nil {
if errors.Unwrap(err).Error() != os.ErrInvalid.Error() &&
errors.Unwrap(err).Error() != "inappropriate ioctl for device" &&
errors.Unwrap(err).Error() != "bad file descriptor" {
// logger.Sync() will return 'invalid argument' error when closing file
log.Fatalf("failed to sync logger %+v", err)
}
// logger.Sync() will return 'invalid argument' error when closing file
log.Fatalf("failed to sync logger %+v", err)
}
}(Default)
}
Expand Down
22 changes: 22 additions & 0 deletions core/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package logger

import (
"errors"
"fmt"
"log"
"os"
Expand Down Expand Up @@ -67,6 +68,8 @@ type Logger interface {
// ErrorIfCalling calls fn and logs any returned error along with func name.
ErrorIfCalling(fn func() error)

// Sync flushes any buffered log entries.
// Some insignificant errors are suppressed.
Sync() error

// withCallerSkip creates a new logger with the number of callers skipped by
Expand Down Expand Up @@ -182,6 +185,25 @@ func (l *zapLogger) PanicIf(err error, msg string) {
}
}

func (l *zapLogger) Sync() error {
err := l.SugaredLogger.Sync()
if err == nil {
return nil
}
var msg string
if uw := errors.Unwrap(err); uw != nil {
msg = uw.Error()
} else {
msg = err.Error()
}
switch msg {
case os.ErrInvalid.Error(), "bad file descriptor",
"inappropriate ioctl for device":
return nil
}
return err
}

// newProductionConfig returns a new production zap.Config.
func newProductionConfig(dir string, jsonConsole bool, toDisk bool) zap.Config {
config := zap.NewProductionConfig()
Expand Down
7 changes: 1 addition & 6 deletions core/services/chainlink/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package chainlink
import (
"bytes"
"context"
stderr "errors"
"fmt"
"math/big"
"os"
Expand Down Expand Up @@ -420,11 +419,7 @@ func (app *ChainlinkApplication) stop() (err error) {
var merr error
defer func() {
if lerr := app.logger.Sync(); lerr != nil {
if stderr.Unwrap(lerr).Error() != os.ErrInvalid.Error() &&
stderr.Unwrap(lerr).Error() != "inappropriate ioctl for device" &&
stderr.Unwrap(lerr).Error() != "bad file descriptor" {
merr = multierr.Append(merr, lerr)
}
merr = multierr.Append(merr, lerr)
}
}()
app.logger.Info("Gracefully exiting...")
Expand Down

0 comments on commit 2ae2215

Please sign in to comment.