loggers.go 3.99 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// Copyright 2014 The go-ethereum Authors
// This file is part of go-ethereum.
//
// go-ethereum is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// go-ethereum is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with go-ethereum.  If not, see <http://www.gnu.org/licenses/>.

17
/*
obscuren's avatar
obscuren committed
18
Package logger implements a multi-output leveled logger.
19

20 21 22 23
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.
24

25
Logging is asynchronous and does not block the caller. Message
26 27 28
formatting is performed by the caller goroutine to avoid incorrect
logging of mutable state.
*/
obscuren's avatar
obscuren committed
29
package logger
zelig's avatar
zelig committed
30 31

import (
Taylor Gerring's avatar
Taylor Gerring committed
32
	"encoding/json"
zelig's avatar
zelig committed
33 34
	"fmt"
	"os"
zelig's avatar
zelig committed
35 36
)

Taylor Gerring's avatar
Taylor Gerring committed
37
type LogLevel uint32
zelig's avatar
zelig committed
38 39

const (
40
	// Standard log levels
zelig's avatar
zelig committed
41 42 43 44 45 46
	Silence LogLevel = iota
	ErrorLevel
	WarnLevel
	InfoLevel
	DebugLevel
	DebugDetailLevel
zelig's avatar
zelig committed
47 48
)

49 50 51
// 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
52
type Logger struct {
zelig's avatar
zelig committed
53
	tag string
zelig's avatar
zelig committed
54 55 56
}

func NewLogger(tag string) *Logger {
57
	return &Logger{"[" + tag + "] "}
zelig's avatar
zelig committed
58 59
}

zelig's avatar
zelig committed
60
func (logger *Logger) Sendln(level LogLevel, v ...interface{}) {
61
	logMessageC <- stdMsg{level, logger.tag + fmt.Sprintln(v...)}
zelig's avatar
zelig committed
62 63
}

zelig's avatar
zelig committed
64
func (logger *Logger) Sendf(level LogLevel, format string, v ...interface{}) {
65
	logMessageC <- stdMsg{level, logger.tag + fmt.Sprintf(format, v...)}
zelig's avatar
zelig committed
66 67
}

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

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

78
// Infoln writes a message with InfoLevel.
zelig's avatar
zelig committed
79
func (logger *Logger) Infoln(v ...interface{}) {
zelig's avatar
zelig committed
80
	logger.Sendln(InfoLevel, v...)
zelig's avatar
zelig committed
81 82
}

83
// Debugln writes a message with DebugLevel.
zelig's avatar
zelig committed
84
func (logger *Logger) Debugln(v ...interface{}) {
zelig's avatar
zelig committed
85
	logger.Sendln(DebugLevel, v...)
zelig's avatar
zelig committed
86 87
}

88
// DebugDetailln writes a message with DebugDetailLevel.
zelig's avatar
zelig committed
89
func (logger *Logger) DebugDetailln(v ...interface{}) {
zelig's avatar
zelig committed
90
	logger.Sendln(DebugDetailLevel, v...)
91 92
}

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

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

103
// Infof writes a message with InfoLevel.
zelig's avatar
zelig committed
104
func (logger *Logger) Infof(format string, v ...interface{}) {
zelig's avatar
zelig committed
105
	logger.Sendf(InfoLevel, format, v...)
zelig's avatar
zelig committed
106 107
}

108
// Debugf writes a message with DebugLevel.
zelig's avatar
zelig committed
109
func (logger *Logger) Debugf(format string, v ...interface{}) {
zelig's avatar
zelig committed
110
	logger.Sendf(DebugLevel, format, v...)
zelig's avatar
zelig committed
111 112
}

113
// DebugDetailf writes a message with DebugDetailLevel.
zelig's avatar
zelig committed
114
func (logger *Logger) DebugDetailf(format string, v ...interface{}) {
zelig's avatar
zelig committed
115
	logger.Sendf(DebugDetailLevel, format, v...)
116 117
}

118
// Fatalln writes a message with ErrorLevel and exits the program.
zelig's avatar
zelig committed
119
func (logger *Logger) Fatalln(v ...interface{}) {
zelig's avatar
zelig committed
120
	logger.Sendln(ErrorLevel, v...)
zelig's avatar
zelig committed
121 122
	Flush()
	os.Exit(0)
zelig's avatar
zelig committed
123 124
}

125
// Fatalf writes a message with ErrorLevel and exits the program.
zelig's avatar
zelig committed
126
func (logger *Logger) Fatalf(format string, v ...interface{}) {
zelig's avatar
zelig committed
127
	logger.Sendf(ErrorLevel, format, v...)
zelig's avatar
zelig committed
128 129
	Flush()
	os.Exit(0)
zelig's avatar
zelig committed
130
}
Taylor Gerring's avatar
Taylor Gerring committed
131

132 133 134
type JsonLogger struct {
	Coinbase string
}
Taylor Gerring's avatar
Taylor Gerring committed
135 136 137 138 139

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

140
func (logger *JsonLogger) LogJson(v JsonLog) {
141
	msgname := v.EventName()
Taylor Gerring's avatar
Taylor Gerring committed
142
	obj := map[string]interface{}{
143
		msgname: v,
Taylor Gerring's avatar
Taylor Gerring committed
144 145 146
	}

	jsontxt, _ := json.Marshal(obj)
147
	logMessageC <- (jsonMsg(jsontxt))
148

Taylor Gerring's avatar
Taylor Gerring committed
149
}