bnkamalesh/webgo

View on GitHub
errors.go

Summary

Maintainability
A
0 mins
Test Coverage
package webgo

import (
    "errors"
    "io"
    "log"
    "os"
)

var (
    // ErrInvalidPort is the error returned when the port number provided in the config file is invalid
    ErrInvalidPort = errors.New("port number not provided or is invalid (should be between 0 - 65535)")

    lh *logHandler
)

type logCfg string

const (
    // LogCfgDisableDebug is used to disable debug logs
    LogCfgDisableDebug = logCfg("disable-debug")
    // LogCfgDisableInfo is used to disable info logs
    LogCfgDisableInfo = logCfg("disable-info")
    // LogCfgDisableWarn is used to disable warning logs
    LogCfgDisableWarn = logCfg("disable-warn")
    // LogCfgDisableError is used to disable error logs
    LogCfgDisableError = logCfg("disable-err")
    // LogCfgDisableFatal is used to disable fatal logs
    LogCfgDisableFatal = logCfg("disable-fatal")
)

// Logger defines all the logging methods to be implemented
type Logger interface {
    Debug(data ...interface{})
    Info(data ...interface{})
    Warn(data ...interface{})
    Error(data ...interface{})
    Fatal(data ...interface{})
}

// logHandler has all the log writer handlers
type logHandler struct {
    debug *log.Logger
    info  *log.Logger
    warn  *log.Logger
    err   *log.Logger
    fatal *log.Logger
}

// Debug prints log of severity 5
func (lh *logHandler) Debug(data ...interface{}) {
    if lh.debug == nil {
        return
    }
    lh.debug.Println(data...)
}

// Info prints logs of severity 4
func (lh *logHandler) Info(data ...interface{}) {
    if lh.info == nil {
        return
    }
    lh.info.Println(data...)
}

// Warn prints log of severity 3
func (lh *logHandler) Warn(data ...interface{}) {
    if lh.warn == nil {
        return
    }
    lh.warn.Println(data...)
}

// Error prints log of severity 2
func (lh *logHandler) Error(data ...interface{}) {
    if lh.err == nil {
        return
    }
    lh.err.Println(data...)
}

// Fatal prints log of severity 1
func (lh *logHandler) Fatal(data ...interface{}) {
    if lh.fatal == nil {
        return
    }
    lh.fatal.Fatalln(data...)
}

// LOGHANDLER is a global variable which webgo uses to log messages
var LOGHANDLER Logger

func init() {
    GlobalLoggerConfig(nil, nil)
}

func loggerWithCfg(stdout io.Writer, stderr io.Writer, cfgs ...logCfg) *logHandler {
    lh = &logHandler{
        debug: log.New(stdout, "Debug ", log.LstdFlags),
        info:  log.New(stdout, "Info ", log.LstdFlags),
        warn:  log.New(stderr, "Warning ", log.LstdFlags),
        err:   log.New(stderr, "Error ", log.LstdFlags),
        fatal: log.New(stderr, "Fatal ", log.LstdFlags|log.Llongfile),
    }

    for _, c := range cfgs {
        switch c {
        case LogCfgDisableDebug:
            {
                lh.debug = nil
            }
        case LogCfgDisableInfo:
            {
                lh.info = nil
            }
        case LogCfgDisableWarn:
            {
                lh.warn = nil
            }
        case LogCfgDisableError:
            {
                lh.err = nil
            }
        case LogCfgDisableFatal:
            {
                lh.fatal = nil
            }
        }
    }
    return lh
}

// GlobalLoggerConfig is used to configure the global/default logger of webgo
// IMPORTANT: This is not concurrent safe
func GlobalLoggerConfig(stdout io.Writer, stderr io.Writer, cfgs ...logCfg) {
    if stdout == nil {
        stdout = os.Stdout
    }

    if stderr == nil {
        stderr = os.Stderr
    }

    LOGHANDLER = loggerWithCfg(stdout, stderr, cfgs...)
}