Skip to content

Commit 6f0f72e

Browse files
committed
added ability to set external logger and fatal log methods
1 parent 6ffce4e commit 6f0f72e

File tree

5 files changed

+85
-29
lines changed

5 files changed

+85
-29
lines changed

default.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,22 @@
44

55
package log
66

7+
import "os"
8+
79
var stdLogger Logger
810

11+
// Fatal logs message as `FATAL` and calls os.Exit(1)
12+
func Fatal(v ...interface{}) {
13+
_ = stdLogger.Output(levelFatal, 2, nil, v...)
14+
os.Exit(1)
15+
}
16+
17+
// Fatalf logs message as `FATAL` and calls os.Exit(1)
18+
func Fatalf(format string, v ...interface{}) {
19+
_ = stdLogger.Output(levelFatal, 2, &format, v...)
20+
os.Exit(1)
21+
}
22+
923
// Error logs message as `LevelError`
1024
func Error(v ...interface{}) {
1125
_ = stdLogger.Output(LevelError, 2, nil, v...)
@@ -72,6 +86,12 @@ func SetLevel(level Level) {
7286
stdLogger.SetLevel(level)
7387
}
7488

89+
// SetOutput allows to set standard logger implementation
90+
// which statisfies `Logger` interface
91+
func SetOutput(logger Logger) {
92+
stdLogger = logger
93+
}
94+
7595
func init() {
7696
stdLogger, _ = New(`receiver = "CONSOLE"; level = "DEBUG";`)
7797
}

default_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (c) Jeevanandam M (https://github.com/jeevatkm)
2+
// go-aah/log source code and usage is governed by a MIT style
3+
// license that can be found in the LICENSE file.
4+
5+
package log
6+
7+
import (
8+
"fmt"
9+
"testing"
10+
11+
"github.com/go-aah/test/assert"
12+
)
13+
14+
func TestDefaultStandardLogger(t *testing.T) {
15+
SetLevel(LevelInfo)
16+
_ = SetPattern("%time:2006-01-02 15:04:05.000 %level:-5 %line %custom:- %message")
17+
Trace("I shoudn't see this msg, because standard logger level is DEBUG")
18+
Debug("I would like to see this message, debug is useful for dev")
19+
Info("Yes, I would love to")
20+
Warn("Yes, yes it's an warning")
21+
Error("Yes, yes, yes - finally an error")
22+
fmt.Println()
23+
24+
t.Logf("First round: %#v\n\n", Stats())
25+
26+
SetLevel(LevelDebug)
27+
_ = SetPattern("%time:2006-01-02 15:04:05.000 %level:-5 %shortfile %line %custom:- %message")
28+
Tracef("I shoudn't see this msg: %v", 4)
29+
Debugf("I would like to see this message, debug is useful for dev: %v", 3)
30+
Infof("Yes, I would love to: %v", 2)
31+
Warnf("Yes, yes it's an warning: %v", 1)
32+
Errorf("Yes, yes, yes - finally an error: %v", 0)
33+
34+
t.Logf("Second round: %#v\n\n", Stats())
35+
36+
err := SetPattern("%level:-5 %shortfile %line %unknown")
37+
assert.NotNil(t, err)
38+
39+
newLogger, _ := New(`receiver = "CONSOLE"; level = "DEBUG";`)
40+
SetOutput(newLogger)
41+
Info("Fresh new face ...")
42+
}

log.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"os"
2323
"runtime"
2424
"strings"
25+
"sync"
2526
"time"
2627

2728
"github.com/go-aah/config"
@@ -36,7 +37,8 @@ type FmtFlag uint8
3637

3738
// Log Level definition
3839
const (
39-
LevelError Level = iota
40+
levelFatal Level = iota
41+
LevelError
4042
LevelWarn
4143
LevelInfo
4244
LevelDebug
@@ -102,6 +104,7 @@ var (
102104
filePermission = os.FileMode(0755)
103105

104106
levelNameToLevel = map[string]Level{
107+
"FATAL": levelFatal,
105108
"ERROR": LevelError,
106109
"WARN": LevelWarn,
107110
"INFO": LevelInfo,
@@ -110,6 +113,7 @@ var (
110113
}
111114

112115
levelToLevelName = map[Level]string{
116+
levelFatal: "FATAL",
113117
LevelError: "ERROR",
114118
LevelWarn: "WARN",
115119
LevelInfo: "INFO",
@@ -120,6 +124,7 @@ var (
120124
// ANSI color codes
121125
resetColor = []byte("\033[0m")
122126
levelToColor = [][]byte{
127+
levelFatal: []byte("\033[0;31m"), // red
123128
LevelError: []byte("\033[0;31m"), // red
124129
LevelWarn: []byte("\033[0;33m"), // yellow
125130
LevelInfo: []byte("\033[0;37m"), // white
@@ -162,6 +167,9 @@ type Logger interface {
162167
// SetLevel allows to set log level dynamically
163168
SetLevel(level Level)
164169

170+
Fatal(v ...interface{})
171+
Fatalf(format string, v ...interface{})
172+
165173
Error(v ...interface{})
166174
Errorf(format string, v ...interface{})
167175

@@ -260,6 +268,7 @@ func newConsoleReceiver(cfg *config.Config, receiverType string, level Level, fl
260268
Type: receiverType,
261269
Flags: flags,
262270
Format: DefaultFormatter,
271+
m: sync.Mutex{},
263272
level: level,
264273
out: os.Stderr,
265274
stats: &ReceiverStats{},

log_test.go

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package log
66

77
import (
8-
"fmt"
98
"os"
109
"path/filepath"
1110
"strings"
@@ -14,32 +13,6 @@ import (
1413
"github.com/go-aah/test/assert"
1514
)
1615

17-
func TestDefaultStandardLogger(t *testing.T) {
18-
SetLevel(LevelInfo)
19-
_ = SetPattern("%time:2006-01-02 15:04:05.000 %level:-5 %line %custom:- %message")
20-
Trace("I shoudn't see this msg, because standard logger level is DEBUG")
21-
Debug("I would like to see this message, debug is useful for dev")
22-
Info("Yes, I would love to")
23-
Warn("Yes, yes it's an warning")
24-
Error("Yes, yes, yes - finally an error")
25-
fmt.Println()
26-
27-
t.Logf("First round: %#v\n\n", Stats())
28-
29-
SetLevel(LevelDebug)
30-
_ = SetPattern("%time:2006-01-02 15:04:05.000 %level:-5 %shortfile %line %custom:- %message")
31-
Tracef("I shoudn't see this msg: %v", 4)
32-
Debugf("I would like to see this message, debug is useful for dev: %v", 3)
33-
Infof("Yes, I would love to: %v", 2)
34-
Warnf("Yes, yes it's an warning: %v", 1)
35-
Errorf("Yes, yes, yes - finally an error: %v", 0)
36-
37-
t.Logf("Second round: %#v\n\n", Stats())
38-
39-
err := SetPattern("%level:-5 %shortfile %line %unknown")
40-
assert.NotNil(t, err)
41-
}
42-
4316
func TestNewCustomUTCConsoleReceiver(t *testing.T) {
4417
config := `
4518
# console logger configuration
@@ -302,7 +275,7 @@ func TestNewMisc(t *testing.T) {
302275

303276
func TestLevelUnknown(t *testing.T) {
304277
var level Level
305-
assert.Equal(t, "ERROR", level.String())
278+
assert.Equal(t, "FATAL", level.String())
306279

307280
level = 9 // Unknown log level
308281
assert.Equal(t, "Unknown", level.String())

receiver.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,18 @@ func (r *Receiver) isFileReceiver() bool {
154154
return r.Type == "FILE"
155155
}
156156

157+
// Fatal logs message as `FATAL` and calls os.Exit(1)
158+
func (r *Receiver) Fatal(v ...interface{}) {
159+
_ = r.Output(levelFatal, 2, nil, v...)
160+
os.Exit(1)
161+
}
162+
163+
// Fatalf logs message as `FATAL` and calls os.Exit(1)
164+
func (r *Receiver) Fatalf(format string, v ...interface{}) {
165+
_ = r.Output(levelFatal, 2, &format, v...)
166+
os.Exit(1)
167+
}
168+
157169
// Error logs message as `LevelError`
158170
func (r *Receiver) Error(v ...interface{}) {
159171
_ = r.Output(LevelError, 2, nil, v...)

0 commit comments

Comments
 (0)