Skip to content

Commit 49eec7d

Browse files
authored
Merge pull request #694 from dashpay/release_0.13.2
chore(release): update changelog and bump version to 0.13.2
2 parents d98719c + f359919 commit 49eec7d

File tree

6 files changed

+86
-56
lines changed

6 files changed

+86
-56
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1+
## [0.13.2] - 2023-10-09
2+
3+
### Bug Fixes
4+
5+
- Log-file-path setting does not work (#691)
6+
17
## [0.13.1] - 2023-09-14
28

39
### Bug Fixes
410

511
- Send evidence only once (#683)
612
- Panic verifying evidence due to missing pubkey (#684)
713

14+
### Miscellaneous Tasks
15+
16+
- Update changelog and version to 0.13.1
17+
818
## [0.13.0] - 2023-09-13
919

1020
### Bug Fixes

cmd/tenderdash/commands/root.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func RootCommand(conf *config.Config, logger log.Logger) *cobra.Command {
5151
}
5252
*conf = *pconf
5353
config.EnsureRoot(conf.RootDir)
54-
if err := log.OverrideWithNewLogger(logger, conf.LogFormat, conf.LogLevel); err != nil {
54+
if err := log.OverrideWithNewLogger(logger, conf.LogFormat, conf.LogLevel, conf.LogFilePath); err != nil {
5555
return err
5656
}
5757
if warning := pconf.DeprecatedFieldWarning(); warning != nil {

cmd/tenderdash/main.go

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package main
22

33
import (
44
"context"
5-
"fmt"
6-
"io"
75
"os"
86

97
"github.com/dashpay/tenderdash/cmd/tenderdash/commands"
@@ -23,11 +21,11 @@ func main() {
2321
panic(err)
2422
}
2523

26-
logger, stopFn, err := newLoggerFromConfig(conf)
24+
logger, err := log.NewMultiLogger(conf.LogFormat, conf.LogLevel, conf.LogFilePath)
2725
if err != nil {
2826
panic(err)
2927
}
30-
defer stopFn()
28+
defer logger.Close()
3129

3230
rcmd := commands.RootCommand(conf, logger)
3331
rcmd.AddCommand(
@@ -64,33 +62,9 @@ func main() {
6462
rcmd.AddCommand(commands.NewRunNodeCmd(nodeFunc, conf, logger))
6563

6664
if err := cli.RunWithTrace(ctx, rcmd); err != nil {
65+
// os.Exit doesn't call defer functions, so we manually close the logger here
66+
cancel()
67+
_ = logger.Close()
6768
os.Exit(2)
6869
}
6970
}
70-
71-
func newLoggerFromConfig(conf *config.Config) (log.Logger, func(), error) {
72-
var (
73-
writer io.Writer = os.Stderr
74-
closeFunc = func() {}
75-
err error
76-
)
77-
if conf.LogFilePath != "" {
78-
file, err := os.OpenFile(conf.LogFilePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
79-
if err != nil {
80-
return nil, nil, fmt.Errorf("failed to create log writer: %w", err)
81-
}
82-
closeFunc = func() {
83-
_ = file.Close()
84-
}
85-
writer = io.MultiWriter(writer, file)
86-
}
87-
writer, err = log.NewFormatter(conf.LogFormat, writer)
88-
if err != nil {
89-
return nil, nil, fmt.Errorf("failed to create log formatter: %w", err)
90-
}
91-
logger, err := log.NewLogger(conf.LogLevel, writer)
92-
if err != nil {
93-
return nil, nil, err
94-
}
95-
return logger, closeFunc, nil
96-
}

libs/log/default.go

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import (
77
"strings"
88
"time"
99

10+
"github.com/hashicorp/go-multierror"
1011
"github.com/rs/zerolog"
1112
)
1213

1314
var _ Logger = (*defaultLogger)(nil)
1415

1516
type defaultLogger struct {
1617
zerolog.Logger
18+
closeFuncs []func() error
1719
}
1820

1921
// NewDefaultLogger returns a default logger that can be used within Tendermint
@@ -25,29 +27,47 @@ type defaultLogger struct {
2527
// that in a generic interface, all logging methods accept a series of key/value
2628
// pair tuples, where the key must be a string.
2729
func NewDefaultLogger(format, level string) (Logger, error) {
28-
var logWriter io.Writer
29-
switch strings.ToLower(format) {
30-
case LogFormatPlain, LogFormatText:
31-
logWriter = zerolog.ConsoleWriter{
32-
Out: os.Stderr,
33-
NoColor: true,
34-
TimeFormat: time.RFC3339Nano,
35-
FormatLevel: func(i interface{}) string {
36-
if ll, ok := i.(string); ok {
37-
return strings.ToUpper(ll)
38-
}
39-
return "????"
40-
},
41-
}
42-
43-
case LogFormatJSON:
44-
logWriter = os.Stderr
30+
return NewMultiLogger(format, level, "")
31+
}
4532

46-
default:
47-
return nil, fmt.Errorf("unsupported log format: %s", format)
33+
// NewMultiLogger creates a new logger that writes to os.Stderr and an additional log file if provided.
34+
// It takes in three parameters: format, level, and additionalLogPath.
35+
// The format parameter specifies the format of the log message.
36+
// The level parameter specifies the minimum log level to write.
37+
// The additionalLogPath parameter specifies the path to the additional log file.
38+
// If additionalLogPath is not empty, the logger writes to both os.Stderr and the additional log file.
39+
// The function returns a Logger interface and an error if any.
40+
//
41+
// See NewDefaultLogger for more details.
42+
func NewMultiLogger(format, level, additionalLogPath string) (Logger, error) {
43+
var (
44+
writer io.Writer = os.Stderr
45+
closeFunc = func() error { return nil }
46+
err error
47+
)
48+
if additionalLogPath != "" {
49+
file, err := os.OpenFile(additionalLogPath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
50+
if err != nil {
51+
return nil, fmt.Errorf("failed to create log writer: %w", err)
52+
}
53+
closeFunc = func() error {
54+
return file.Close()
55+
}
56+
writer = io.MultiWriter(writer, file)
57+
}
58+
writer, err = NewFormatter(format, writer)
59+
if err != nil {
60+
_ = closeFunc()
61+
return nil, fmt.Errorf("failed to create log formatter: %w", err)
62+
}
63+
logger, err := NewLogger(level, writer)
64+
if err != nil {
65+
_ = closeFunc()
66+
return nil, err
4867
}
68+
logger.(*defaultLogger).closeFuncs = append(logger.(*defaultLogger).closeFuncs, closeFunc)
4969

50-
return NewLogger(level, logWriter)
70+
return logger, nil
5171
}
5272

5373
func NewLogger(level string, logWriter io.Writer) (Logger, error) {
@@ -59,7 +79,9 @@ func NewLogger(level string, logWriter io.Writer) (Logger, error) {
5979
// make the writer thread-safe
6080
logWriter = newSyncWriter(logWriter)
6181

62-
return &defaultLogger{Logger: zerolog.New(logWriter).Level(logLevel).With().Timestamp().Logger()}, nil
82+
return &defaultLogger{
83+
Logger: zerolog.New(logWriter).Level(logLevel).With().Timestamp().Logger(),
84+
}, nil
6385
}
6486

6587
func (l defaultLogger) Info(msg string, keyVals ...interface{}) {
@@ -81,26 +103,48 @@ func (l defaultLogger) Trace(msg string, keyVals ...interface{}) {
81103
func (l defaultLogger) With(keyVals ...interface{}) Logger {
82104
return &defaultLogger{Logger: l.Logger.With().Fields(getLogFields(keyVals...)).Logger()}
83105
}
106+
func (l *defaultLogger) Close() (err error) {
107+
if l == nil {
108+
return nil
109+
}
110+
l.Debug("Closing logger")
111+
for _, f := range l.closeFuncs {
112+
if e := f(); e != nil {
113+
err = multierror.Append(err, e)
114+
}
115+
}
116+
117+
l.closeFuncs = nil
118+
119+
return err
120+
}
84121

85122
// OverrideWithNewLogger replaces an existing logger's internal with
86123
// a new logger, and makes it possible to reconfigure an existing
87124
// logger that has already been propagated to callers.
88-
func OverrideWithNewLogger(logger Logger, format, level string) error {
125+
func OverrideWithNewLogger(logger Logger, format, level, additionalLogFilePath string) error {
89126
ol, ok := logger.(*defaultLogger)
90127
if !ok {
91128
return fmt.Errorf("logger %T cannot be overridden", logger)
92129
}
93130

94-
newLogger, err := NewDefaultLogger(format, level)
131+
newLogger, err := NewMultiLogger(format, level, additionalLogFilePath)
95132
if err != nil {
96133
return err
97134
}
98135
nl, ok := newLogger.(*defaultLogger)
99136
if !ok {
137+
newLogger.Close()
100138
return fmt.Errorf("logger %T cannot be overridden by %T", logger, newLogger)
101139
}
102140

141+
if err := ol.Close(); err != nil {
142+
return err
143+
}
144+
103145
ol.Logger = nl.Logger
146+
ol.closeFuncs = nl.closeFuncs
147+
104148
return nil
105149
}
106150

libs/log/logger.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ const (
3232

3333
// Logger defines a generic logging interface compatible with Tendermint.
3434
type Logger interface {
35+
io.Closer
36+
3537
Trace(msg string, keyVals ...interface{})
3638
Debug(msg string, keyVals ...interface{})
3739
Info(msg string, keyVals ...interface{})

version/version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ var (
99
const (
1010
// TMVersionDefault is the used as the fallback version for Tenderdash
1111
// when not using git describe. It is formatted with semantic versioning.
12-
TMVersionDefault = "0.13.1"
12+
TMVersionDefault = "0.13.2"
1313
// ABCISemVer is the semantic version of the ABCI library
1414
ABCISemVer = "0.23.0"
1515

0 commit comments

Comments
 (0)