Documentation ¶
Overview ¶
Package logger implements a multi-output leveled logger.
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.
Logging is asynchronous and does not block the caller. Message formatting is performed by the caller goroutine to avoid incorrect logging of mutable state.
Index ¶
- Constants
- Variables
- func AddLogSystem(sys LogSystem)
- func ColorBlue(s string) (coloredString string)
- func ColorGreen(s string) (coloredString string)
- func ColorMagenta(s string) (coloredString string)
- func ColorRed(s string) (coloredString string)
- func ColorYellow(s string) (coloredString string)
- func CreateMLogFile(t time.Time) (f *os.File, filename string, err error)
- func Flush()
- func GetMLogDir() string
- func GetMLogFormat() mlogFormatT
- func GetMLogRegistryActive() map[mlogComponent]*Logger
- func GetMLogRegistryAvailable() map[mlogComponent][]*MLogT
- func MLogRegisterActive(component mlogComponent)
- func MLogRegisterAvailable(name string, lines []*MLogT) mlogComponent
- func MLogRegisterComponentsFromContext(s string) error
- func MlogEnabled() bool
- func Reset()
- func SetMLogDir(str string)
- func SetMLogFormat(format mlogFormatT)
- func SetMLogFormatFromString(formatString string) error
- func SetMlogEnabled(b bool)
- type EthChainNewHead
- type EthChainReceivedNewBlock
- type EthMinerNewBlock
- type EthTxReceived
- type JsonLog
- type JsonLogger
- type LogEvent
- type LogLevel
- type LogMsg
- type LogStarting
- type LogSystem
- type Logger
- func (logger *Logger) DebugDetailf(format string, v ...interface{})
- func (logger *Logger) DebugDetailln(v ...interface{})
- func (logger *Logger) Debugf(format string, v ...interface{})
- func (logger *Logger) Debugln(v ...interface{})
- func (logger *Logger) Errorf(format string, v ...interface{})
- func (logger *Logger) Errorln(v ...interface{})
- func (logger *Logger) Fatalf(format string, v ...interface{})
- func (logger *Logger) Fatalln(v ...interface{})
- func (logger *Logger) GetTag() string
- func (logger *Logger) Infof(format string, v ...interface{})
- func (logger *Logger) Infoln(v ...interface{})
- func (l *Logger) SendFormatted(format mlogFormatT, level LogLevel, msg *MLogT, c mlogComponent)
- func (logger *Logger) Sendf(level LogLevel, format string, v ...interface{})
- func (logger *Logger) Sendln(level LogLevel, v ...interface{})
- func (logger *Logger) Warnf(format string, v ...interface{})
- func (logger *Logger) Warnln(v ...interface{})
- type MLogDetailT
- type MLogSystem
- type MLogT
- func (m *MLogT) AssignDetails(detailVals ...interface{}) *MLogT
- func (m *MLogT) EventName() string
- func (m *MLogT) FormatDocumentation(cmp mlogComponent) (out string)
- func (m *MLogT) FormatJSON(c mlogComponent) []byte
- func (m *MLogT) FormatJSONExample(c mlogComponent) []byte
- func (m *MLogT) FormatKV() (out string)
- func (m *MLogT) FormatPlain() (out string)
- func (m *MLogT) MarshalJSON(c mlogComponent) ([]byte, error)
- func (msg *MLogT) Send(c mlogComponent)
- type P2PConnected
- type P2PDisconnected
- type StdLogSystem
Examples ¶
Constants ¶
const ( Error = iota + 1 Warn Info Core Debug Detail Ridiculousness = 100 )
const (
MLOGJSON mlogFormatT
)
Variables ¶
var ( ErrUnkownMLogFormat = errors.New("unknown mlog format") MLogStringToFormat = map[string]mlogFormatT{ "plain": mLOGPlain, "kv": mLOGKV, "json": MLOGJSON, } )
Functions ¶
func AddLogSystem ¶
func AddLogSystem(sys LogSystem)
AddLogSystem starts printing messages to the given LogSystem.
func ColorGreen ¶
func ColorMagenta ¶
func ColorYellow ¶
func CreateMLogFile ¶
CreateMLogFile creates a new log file and returns the file and its filename, which contains tag ("INFO", "FATAL", etc.) and t. If the file is created successfully, create also attempts to update the symlink for that tag, ignoring errors.
func Flush ¶
func Flush()
Flush waits until all current log messages have been dispatched to the active log systems.
func GetMLogDir ¶
func GetMLogDir() string
func GetMLogFormat ¶
func GetMLogFormat() mlogFormatT
func GetMLogRegistryActive ¶
func GetMLogRegistryActive() map[mlogComponent]*Logger
GetMlogRegistryActive returns copy of all active components mapping
func GetMLogRegistryAvailable ¶
func GetMLogRegistryAvailable() map[mlogComponent][]*MLogT
GetMlogRegistryAvailable returns copy of all registered components mapping
func MLogRegisterActive ¶
func MLogRegisterActive(component mlogComponent)
MLogRegisterActive registers a component for mlogging. Only registered loggers will write to mlog file.
func MLogRegisterAvailable ¶
MLogRegisterAvailable is called for each log component variable from a package/mlog.go file as they set up their mlog vars. It registers an mlog component as Available.
func MLogRegisterComponentsFromContext ¶
MLogRegisterComponentsFromContext receives a comma-separated string of desired mlog components. It returns an error if the specified mlog component is unavailable. For each available component, the desires mlog components are registered as active, creating new loggers for each. If the string begins with '!', the function will remove the following components from the default list
func MlogEnabled ¶
func MlogEnabled() bool
func Reset ¶
func Reset()
Reset removes all active log systems. It blocks until all current messages have been delivered.
func SetMLogDir ¶
func SetMLogDir(str string)
SetMLogDir sets the mlog directory, into which one mlog file per session will be written.
func SetMLogFormat ¶
func SetMLogFormat(format mlogFormatT)
func SetMLogFormatFromString ¶
func SetMlogEnabled ¶
func SetMlogEnabled(b bool)
Types ¶
type EthChainNewHead ¶
type EthChainNewHead struct { BlockHash string `json:"block_hash"` BlockNumber *big.Int `json:"block_number"` ChainHeadHash string `json:"chain_head_hash"` BlockPrevHash string `json:"block_prev_hash"` LogEvent }
func (*EthChainNewHead) EventName ¶
func (l *EthChainNewHead) EventName() string
type EthChainReceivedNewBlock ¶
type EthChainReceivedNewBlock struct { BlockHash string `json:"block_hash"` BlockNumber *big.Int `json:"block_number"` ChainHeadHash string `json:"chain_head_hash"` BlockPrevHash string `json:"block_prev_hash"` RemoteId string `json:"remote_id"` LogEvent }
func (*EthChainReceivedNewBlock) EventName ¶
func (l *EthChainReceivedNewBlock) EventName() string
type EthMinerNewBlock ¶
type EthMinerNewBlock struct { BlockHash string `json:"block_hash"` BlockNumber *big.Int `json:"block_number"` ChainHeadHash string `json:"chain_head_hash"` BlockPrevHash string `json:"block_prev_hash"` LogEvent }
func (*EthMinerNewBlock) EventName ¶
func (l *EthMinerNewBlock) EventName() string
type EthTxReceived ¶
type EthTxReceived struct { TxHash string `json:"tx_hash"` RemoteId string `json:"remote_id"` LogEvent }
func (*EthTxReceived) EventName ¶
func (l *EthTxReceived) EventName() string
type JsonLogger ¶
type JsonLogger struct {
Coinbase string
}
func NewJsonLogger ¶
func NewJsonLogger() *JsonLogger
func (*JsonLogger) LogJson ¶
func (logger *JsonLogger) LogJson(v JsonLog)
type LogStarting ¶
type LogStarting struct { ClientString string `json:"client_impl"` ProtocolVersion int `json:"eth_version"` LogEvent }
func (*LogStarting) EventName ¶
func (l *LogStarting) EventName() string
type LogSystem ¶
LogSystem is implemented by log output devices. All methods can be called concurrently from multiple goroutines.
Example ¶
filename := "test.log" file, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, os.ModePerm) fileLog := NewStdLogSystem(file, 0, WarnLevel) AddLogSystem(fileLog) stdoutLog := NewStdLogSystem(os.Stdout, 0, WarnLevel) AddLogSystem(stdoutLog) NewLogger("TAG").Warnln("reactor meltdown") // writes to both logs
Output:
func BuildNewMLogSystem ¶
func NewJSONsystem ¶
func NewJsonLogSystem ¶
NewJSONLogSystem creates a LogSystem that prints to the given writer without adding extra information irrespective of loglevel only if message is JSON type
type Logger ¶
type Logger struct {
// contains filtered or unexported fields
}
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.
Example ¶
logger := NewLogger("TAG") logger.Infoln("so awesome") // prints [TAG] so awesome logger.Infof("this %q is raw", "coin") // prints [TAG] this "coin" is raw
Output:
func (*Logger) DebugDetailf ¶
DebugDetailf writes a message with DebugDetailLevel.
func (*Logger) DebugDetailln ¶
func (logger *Logger) DebugDetailln(v ...interface{})
DebugDetailln writes a message with DebugDetailLevel.
func (*Logger) Debugln ¶
func (logger *Logger) Debugln(v ...interface{})
Debugln writes a message with DebugLevel.
func (*Logger) Errorln ¶
func (logger *Logger) Errorln(v ...interface{})
Errorln writes a message with ErrorLevel.
func (*Logger) Fatalln ¶
func (logger *Logger) Fatalln(v ...interface{})
Fatalln writes a message with ErrorLevel and exits the program.
func (*Logger) Infoln ¶
func (logger *Logger) Infoln(v ...interface{})
Infoln writes a message with InfoLevel.
func (*Logger) SendFormatted ¶
type MLogDetailT ¶
type MLogDetailT struct { Owner string `json:"owner"` Key string `json:"key"` Value interface{} `json:"value"` }
MLogDetailT defines an mlog LINE DETAILS
func (*MLogDetailT) AsDocumentation ¶
func (m *MLogDetailT) AsDocumentation() *MLogDetailT
func (*MLogDetailT) EventName ¶
func (m *MLogDetailT) EventName() string
type MLogSystem ¶
type MLogSystem struct {
// contains filtered or unexported fields
}
func NewMLogSystem ¶
func (*MLogSystem) GetLogLevel ¶
func (m *MLogSystem) GetLogLevel() LogLevel
func (*MLogSystem) GetLogger ¶
func (m *MLogSystem) GetLogger() *log.Logger
func (*MLogSystem) LogPrint ¶
func (m *MLogSystem) LogPrint(msg LogMsg)
func (*MLogSystem) NewFile ¶
func (m *MLogSystem) NewFile() io.Writer
type MLogT ¶
type MLogT struct { sync.Mutex // TODO: can remove these json tags, since we have a custom MarshalJSON fn Description string `json:"-"` Receiver string `json:"receiver"` Verb string `json:"verb"` Subject string `json:"subject"` Details []MLogDetailT `json:"details"` }
MLogT defines an mlog LINE
func (*MLogT) AssignDetails ¶
AssignDetails is a setter function for setting values for pre-existing details. It accepts a variadic number of empty interfaces. If the number of arguments does not match the number of established details for the receiving MLogT, it will fatal error. Arguments MUST be provided in the order in which they should be applied to the slice of existing details.
func (*MLogT) EventName ¶
EventName implements the JsonMsg interface in case wanting to use existing half-established json logging system
func (*MLogT) FormatDocumentation ¶
FormatDocumentation prints wiki-ready documentation for all available component mlog LINES. Output should be in markdown.
func (*MLogT) FormatJSON ¶
func (*MLogT) FormatJSONExample ¶
func (*MLogT) FormatPlain ¶
func (*MLogT) MarshalJSON ¶
type P2PConnected ¶
type P2PConnected struct { RemoteId string `json:"remote_id"` RemoteAddress string `json:"remote_addr"` RemoteVersionString string `json:"remote_version_string"` NumConnections int `json:"num_connections"` LogEvent }
func (*P2PConnected) EventName ¶
func (l *P2PConnected) EventName() string
type P2PDisconnected ¶
type P2PDisconnected struct { NumConnections int `json:"num_connections"` RemoteId string `json:"remote_id"` LogEvent }
func (*P2PDisconnected) EventName ¶
func (l *P2PDisconnected) EventName() string
type StdLogSystem ¶
type StdLogSystem struct {
// contains filtered or unexported fields
}
func NewStdLogSystem ¶
func NewStdLogSystem(writer io.Writer, flags int, level LogLevel) *StdLogSystem
NewStdLogSystem creates a LogSystem that prints to the given writer. The flag values are defined package log.
func (*StdLogSystem) GetLogLevel ¶
func (t *StdLogSystem) GetLogLevel() LogLevel
func (*StdLogSystem) GetLogger ¶
func (t *StdLogSystem) GetLogger() *log.Logger
GetLogger is unused, fulfills interface
func (*StdLogSystem) LogPrint ¶
func (t *StdLogSystem) LogPrint(msg LogMsg)
func (*StdLogSystem) SetLogLevel ¶
func (t *StdLogSystem) SetLogLevel(i LogLevel)