loggers.go 3.26 KB
Newer Older
1
/*
obscuren's avatar
obscuren committed
2
Package logger implements a multi-output leveled logger.
3

4 5 6 7
Other packages use tagged logger to send log messages to shared
(process-wide) logging engine. The shared logging engine dispatches to
multiple log systems. The log level can be set separately per log
system.
8

9
Logging is asynchronous and does not block the caller. Message
10 11 12
formatting is performed by the caller goroutine to avoid incorrect
logging of mutable state.
*/
obscuren's avatar
obscuren committed
13
package logger
zelig's avatar
zelig committed
14 15

import (
Taylor Gerring's avatar
Taylor Gerring committed
16
	"encoding/json"
zelig's avatar
zelig committed
17 18
	"fmt"
	"os"
zelig's avatar
zelig committed
19 20
)

Taylor Gerring's avatar
Taylor Gerring committed
21
type LogLevel uint32
zelig's avatar
zelig committed
22 23

const (
24
	// Standard log levels
zelig's avatar
zelig committed
25 26 27 28 29 30
	Silence LogLevel = iota
	ErrorLevel
	WarnLevel
	InfoLevel
	DebugLevel
	DebugDetailLevel
zelig's avatar
zelig committed
31 32
)

33 34 35
// A Logger prints messages prefixed by a given tag. It provides named
// Printf and Println style methods for all loglevels. Each ethereum
// component should have its own logger with a unique prefix.
zelig's avatar
zelig committed
36
type Logger struct {
zelig's avatar
zelig committed
37
	tag string
zelig's avatar
zelig committed
38 39 40
}

func NewLogger(tag string) *Logger {
41
	return &Logger{"[" + tag + "] "}
zelig's avatar
zelig committed
42 43
}

zelig's avatar
zelig committed
44
func (logger *Logger) Sendln(level LogLevel, v ...interface{}) {
45
	logMessageC <- stdMsg{level, logger.tag + fmt.Sprintln(v...)}
zelig's avatar
zelig committed
46 47
}

zelig's avatar
zelig committed
48
func (logger *Logger) Sendf(level LogLevel, format string, v ...interface{}) {
49
	logMessageC <- stdMsg{level, logger.tag + fmt.Sprintf(format, v...)}
zelig's avatar
zelig committed
50 51
}

52
// Errorln writes a message with ErrorLevel.
zelig's avatar
zelig committed
53
func (logger *Logger) Errorln(v ...interface{}) {
zelig's avatar
zelig committed
54
	logger.Sendln(ErrorLevel, v...)
zelig's avatar
zelig committed
55 56
}

57
// Warnln writes a message with WarnLevel.
zelig's avatar
zelig committed
58
func (logger *Logger) Warnln(v ...interface{}) {
zelig's avatar
zelig committed
59
	logger.Sendln(WarnLevel, v...)
zelig's avatar
zelig committed
60 61
}

62
// Infoln writes a message with InfoLevel.
zelig's avatar
zelig committed
63
func (logger *Logger) Infoln(v ...interface{}) {
zelig's avatar
zelig committed
64
	logger.Sendln(InfoLevel, v...)
zelig's avatar
zelig committed
65 66
}

67
// Debugln writes a message with DebugLevel.
zelig's avatar
zelig committed
68
func (logger *Logger) Debugln(v ...interface{}) {
zelig's avatar
zelig committed
69
	logger.Sendln(DebugLevel, v...)
zelig's avatar
zelig committed
70 71
}

72
// DebugDetailln writes a message with DebugDetailLevel.
zelig's avatar
zelig committed
73
func (logger *Logger) DebugDetailln(v ...interface{}) {
zelig's avatar
zelig committed
74
	logger.Sendln(DebugDetailLevel, v...)
75 76
}

77
// Errorf writes a message with ErrorLevel.
zelig's avatar
zelig committed
78
func (logger *Logger) Errorf(format string, v ...interface{}) {
zelig's avatar
zelig committed
79
	logger.Sendf(ErrorLevel, format, v...)
zelig's avatar
zelig committed
80 81
}

82
// Warnf writes a message with WarnLevel.
zelig's avatar
zelig committed
83
func (logger *Logger) Warnf(format string, v ...interface{}) {
zelig's avatar
zelig committed
84
	logger.Sendf(WarnLevel, format, v...)
zelig's avatar
zelig committed
85 86
}

87
// Infof writes a message with InfoLevel.
zelig's avatar
zelig committed
88
func (logger *Logger) Infof(format string, v ...interface{}) {
zelig's avatar
zelig committed
89
	logger.Sendf(InfoLevel, format, v...)
zelig's avatar
zelig committed
90 91
}

92
// Debugf writes a message with DebugLevel.
zelig's avatar
zelig committed
93
func (logger *Logger) Debugf(format string, v ...interface{}) {
zelig's avatar
zelig committed
94
	logger.Sendf(DebugLevel, format, v...)
zelig's avatar
zelig committed
95 96
}

97
// DebugDetailf writes a message with DebugDetailLevel.
zelig's avatar
zelig committed
98
func (logger *Logger) DebugDetailf(format string, v ...interface{}) {
zelig's avatar
zelig committed
99
	logger.Sendf(DebugDetailLevel, format, v...)
100 101
}

102
// Fatalln writes a message with ErrorLevel and exits the program.
zelig's avatar
zelig committed
103
func (logger *Logger) Fatalln(v ...interface{}) {
zelig's avatar
zelig committed
104
	logger.Sendln(ErrorLevel, v...)
zelig's avatar
zelig committed
105 106
	Flush()
	os.Exit(0)
zelig's avatar
zelig committed
107 108
}

109
// Fatalf writes a message with ErrorLevel and exits the program.
zelig's avatar
zelig committed
110
func (logger *Logger) Fatalf(format string, v ...interface{}) {
zelig's avatar
zelig committed
111
	logger.Sendf(ErrorLevel, format, v...)
zelig's avatar
zelig committed
112 113
	Flush()
	os.Exit(0)
zelig's avatar
zelig committed
114
}
Taylor Gerring's avatar
Taylor Gerring committed
115

116 117 118
type JsonLogger struct {
	Coinbase string
}
Taylor Gerring's avatar
Taylor Gerring committed
119 120 121 122 123

func NewJsonLogger() *JsonLogger {
	return &JsonLogger{}
}

124
func (logger *JsonLogger) LogJson(v JsonLog) {
125
	msgname := v.EventName()
Taylor Gerring's avatar
Taylor Gerring committed
126
	obj := map[string]interface{}{
127
		msgname: v,
Taylor Gerring's avatar
Taylor Gerring committed
128 129 130
	}

	jsontxt, _ := json.Marshal(obj)
131
	logMessageC <- (jsonMsg(jsontxt))
132

Taylor Gerring's avatar
Taylor Gerring committed
133
}