plugin/logger/stdlib/stdlib.go (87 lines of code) (raw):
package stdlib
/*
Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
*/
import (
"log"
"os"
"github.com/facebookincubator/go2chef"
"github.com/mitchellh/mapstructure"
)
// TypeName is the name of this logger plugin
const TypeName = "go2chef.logger.stdlib"
// Logger represents a logger that just sends output to the
// default stdlib log library with some level info.
type Logger struct {
LoggerName string
log *log.Logger
level int
debug int
}
// Config defines the structure of the configuration for this
// logger. It's separated in this case since the level spec
// in the configuration file is a string and the internal
// representation is numeric.
type Config struct {
Level string
Debugging int
}
// NewFromLogger creates a new instance of the stdlib logger
// from an existing log.Logger
func NewFromLogger(l *log.Logger, level, debug int) *Logger {
return &Logger{
LoggerName: "go2chef",
log: l,
level: level,
debug: debug,
}
}
func (l *Logger) String() string {
return "<" + TypeName + ":" + l.LoggerName + ">"
}
// Name returns the name of this logger instance
func (l *Logger) Name() string { return l.LoggerName }
// SetName sets the name of this logger instance
func (l *Logger) SetName(s string) { l.LoggerName = s }
// Type returns the type of this logger instance
func (l *Logger) Type() string {
return TypeName
}
// SetDebug sets the debugging level threshold
func (l *Logger) SetDebug(dbg int) {
l.debug = dbg
}
// SetLevel sets the overall logging level threshold
func (l *Logger) SetLevel(lvl int) {
l.level = lvl
}
// Errorf writes a message at ERROR level
func (l *Logger) Errorf(fmt string, args ...interface{}) {
l.log.Printf("ERROR: "+fmt, args...)
}
// Infof writes a message at INFO level
func (l *Logger) Infof(fmt string, args ...interface{}) {
if l.level >= go2chef.LogLevelInfo {
l.log.Printf("INFO: "+fmt, args...)
}
}
// Debugf writes a message at DEBUG level *if* the debug level
// is at least as high as the level passed by the caller.
func (l *Logger) Debugf(dbg int, fmt string, args ...interface{}) {
if l.level >= go2chef.LogLevelDebug && dbg >= l.debug {
l.log.Printf("DEBUG: "+fmt, args...)
}
}
// WriteEvent writes a formatted event at INFO level
func (l *Logger) WriteEvent(e *go2chef.Event) {
l.log.Printf("EVENT: %s in %s - %s", e.Event, e.Component, e.Message)
}
// Loader creates an StdlibLogger from a config map
func Loader(config map[string]interface{}) (go2chef.Logger, error) {
name, _, err := go2chef.GetNameType(config)
if err != nil {
return nil, err
}
parse := Config{}
ret := &Logger{
name,
log.New(os.Stderr, "GO2CHEF ", log.LstdFlags),
go2chef.LogLevelInfo,
0,
}
if err := mapstructure.Decode(config, &parse); err != nil {
return nil, err
}
realLevel, err := go2chef.StringToLogLevel(parse.Level)
if err != nil {
return nil, err
}
// set all levels based on config
ret.SetLevel(realLevel)
ret.SetDebug(parse.Debugging)
return ret, nil
}
// Shutdown is a no-op for this logger
func (l *Logger) Shutdown() {}
var _ go2chef.Logger = &Logger{}
var _ go2chef.LoggerLoader = Loader
func init() {
if go2chef.AutoRegisterPlugins {
go2chef.RegisterLogger(TypeName, Loader)
}
}