forked from jshiffer/matterbridge
84 lines
2.7 KiB
Go
84 lines
2.7 KiB
Go
// Copyright (c) 2021 Tulir Asokan
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
// Package waLog contains a simple logger interface used by the other whatsmeow packages.
|
|
package waLog
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// Logger is a simple logger interface that can have subloggers for specific areas.
|
|
type Logger interface {
|
|
Warnf(msg string, args ...interface{})
|
|
Errorf(msg string, args ...interface{})
|
|
Infof(msg string, args ...interface{})
|
|
Debugf(msg string, args ...interface{})
|
|
Sub(module string) Logger
|
|
}
|
|
|
|
type noopLogger struct{}
|
|
|
|
func (n *noopLogger) Errorf(_ string, _ ...interface{}) {}
|
|
func (n *noopLogger) Warnf(_ string, _ ...interface{}) {}
|
|
func (n *noopLogger) Infof(_ string, _ ...interface{}) {}
|
|
func (n *noopLogger) Debugf(_ string, _ ...interface{}) {}
|
|
func (n *noopLogger) Sub(_ string) Logger { return n }
|
|
|
|
// Noop is a no-op Logger implementation that silently drops everything.
|
|
var Noop Logger = &noopLogger{}
|
|
|
|
type stdoutLogger struct {
|
|
mod string
|
|
color bool
|
|
min int
|
|
}
|
|
|
|
var colors = map[string]string{
|
|
"INFO": "\033[36m",
|
|
"WARN": "\033[33m",
|
|
"ERROR": "\033[31m",
|
|
}
|
|
|
|
var levelToInt = map[string]int{
|
|
"": -1,
|
|
"DEBUG": 0,
|
|
"INFO": 1,
|
|
"WARN": 2,
|
|
"ERROR": 3,
|
|
}
|
|
|
|
func (s *stdoutLogger) outputf(level, msg string, args ...interface{}) {
|
|
if levelToInt[level] < s.min {
|
|
return
|
|
}
|
|
var colorStart, colorReset string
|
|
if s.color {
|
|
colorStart = colors[level]
|
|
colorReset = "\033[0m"
|
|
}
|
|
fmt.Printf("%s%s [%s %s] %s%s\n", time.Now().Format("15:04:05.000"), colorStart, s.mod, level, fmt.Sprintf(msg, args...), colorReset)
|
|
}
|
|
|
|
func (s *stdoutLogger) Errorf(msg string, args ...interface{}) { s.outputf("ERROR", msg, args...) }
|
|
func (s *stdoutLogger) Warnf(msg string, args ...interface{}) { s.outputf("WARN", msg, args...) }
|
|
func (s *stdoutLogger) Infof(msg string, args ...interface{}) { s.outputf("INFO", msg, args...) }
|
|
func (s *stdoutLogger) Debugf(msg string, args ...interface{}) { s.outputf("DEBUG", msg, args...) }
|
|
func (s *stdoutLogger) Sub(mod string) Logger {
|
|
return &stdoutLogger{mod: fmt.Sprintf("%s/%s", s.mod, mod), color: s.color, min: s.min}
|
|
}
|
|
|
|
// Stdout is a simple Logger implementation that outputs to stdout. The module name given is included in log lines.
|
|
//
|
|
// minLevel specifies the minimum log level to output. An empty string will output all logs.
|
|
//
|
|
// If color is true, then info, warn and error logs will be colored cyan, yellow and red respectively using ANSI color escape codes.
|
|
func Stdout(module string, minLevel string, color bool) Logger {
|
|
return &stdoutLogger{mod: module, color: color, min: levelToInt[strings.ToUpper(minLevel)]}
|
|
}
|