plugeth/ethlog
zelig d4300c406c logger fix
- introduce quit, drained, shutdown channels
- mainLoop falls through reading message channel to drained state, and waits is blocked in default branch until any message is sent
- Flush() waits for <-drained
- Stop() pushes quit and nodges mainloop out of blocking drained state
- package-global mutex
- Reset()
- clear tests
2014-07-05 19:11:08 +01:00
..
loggers_test.go logger fix 2014-07-05 19:11:08 +01:00
loggers.go logger fix 2014-07-05 19:11:08 +01:00
README.md update doc: list levels and show usage of named print methods 2014-06-25 16:38:42 +01:00

Features

  • packages use tagged logger sending log messages to shared (process-wide) logging engine
  • log writers (interface ethlog.LogSystem) can be added to the logging engine by wrappers/guis/clients
  • shared logging engine dispatching to multiple log systems
  • log level can be set separately per log system
  • async logging thread: logging IO does not block main thread
  • log messages are synchronously stringified to avoid incorrectly logging of changed states
  • log level enum: ethlog.LogLevel: Silence, ErrorLevel, WarnLevel, InfoLevel, DebugLevel, DebugDetailLevel

Usage

In an ethereum component package:

import "github.com/ethereum/eth-go/ethlog"

// package-wide logger using tag
var logger = ethlog.NewLogger("TAG")

Logger provides named Printf and Println style methods for all loglevels

logger.Infoln("this is info") # > [TAG] This is info
logger.Infof("this %v is info", object) # > [TAG] This object is info

Ethereum wrappers should register log systems conforming to ethlog.LogSystem

import "github.com/ethereum/eth-go/ethlog"

type CustomLogWriter struct {
  logLevel ethlog.LogLevel
}

func (t *TestLogSystem) SetLogLevel(i LogLevel) {
  t.level = i
}

func (t *TestLogSystem) GetLogLevel() LogLevel {
  return t.level
}

func (c *CustomLogWriter) Printf(format string, v...interface{}) {
  //....
}

func (c *CustomLogWriter) Println(v...interface{}) {
  //....
}

ethlog.AddLogWriter(&CustomLogWriter{})

ethlog also provides constructors for that wrap io.Writers into a standard logger with a settable level:

filename := "test.log"
file, _ := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, os.ModePerm)
fileLogSystem := NewStdLogSystem(file, 0, WarnLevel)
AddLogSystem(fileLogSystem)
stdOutLogSystem := NewStdLogSystem(os.Stdout, 0, WarnLevel)
AddLogSystem(stdOutLogSystem)