op-geth/ethlog/README.md

1.9 KiB

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)